Linux雜記 查詢與特殊許可權位

junwind發表於2021-03-11
let i=$[$i+1]    let i+=1   let i++
let sum=$[$sum+$i]   let sum+=$i
-=   i--
++i  --i 

*=
/=
%=

[root@localhost ~]# i=14
[root@localhost ~]# let i%=3
[root@localhost ~]# echo $i
2


計算100以內所有能被3整除的正整數的和(就是 number%3=0)

計算100以內所有奇數的和,以及所有偶數的和,分別顯示之;
#!/bin/bash
#
declare -i evensum=0
declare -i oddsum=0

for i in {1..100}; do
    if [ $[$i%2] -eq 0 ]; then
        let evensum+=$i
    else
        let oddsum+=$i
    fi
done

echo "Odd sum is: $oddsum."
echo "Even sum is: $evensum."


檔案查詢:
常用命令:
    locate
        非實時,模糊匹配查詢 ,速度快,查詢是根據全系統檔案資料庫進行的;
        任務計劃--晚上自動將本機系統上的所有檔案的相關資訊收集起來--儲存至資料庫中
        手動更新 updatedb  手動生成檔案資料庫

    find:
        實時查詢,精確
        通過遍歷指定目錄中的所有檔案完成查詢,速度慢
        支援眾多查詢標準

    find [查詢路徑] 查詢標準 查詢到後的處理動作

        [查詢路徑] : 可省略,預設表示當前目錄
        查詢標準(匹配標準) : 預設為指定路徑下的所有檔案(及其子目錄的)
        查詢到後的處理動作 : action,預設為顯示到螢幕上

        查詢標準(匹配標準):
            -name 'filename' : 對檔名做精確匹配

            檔名通配:
                *  任意長度,任意字元
                ?  任意單個字元
                []  範圍內的單個字元

             [root@localhost tmp]# find /etc -name 'passwd'
                /etc/pam.d/passwd
                /etc/passwd


            /etc下以passwd開頭的所有檔案
                    [root@localhost tmp]# find /etc -name "passwd*"
                    /etc/pam.d/passwd
                    /etc/passwd.OLD
                    /etc/passwd-
                    /etc/passwd

                /etc下以passwd結尾的所有檔案
                    [root@localhost tmp]# find /etc -name "*passwd"
                    /etc/pam.d/passwd
                    /etc/security/opasswd
                    /etc/passwd

                /etc下包含passwd的所有檔案
                    [root@localhost tmp]# find /etc -name "*passwd*"
                    /etc/pam.d/passwd
                    /etc/passwd.OLD
                    /etc/security/opasswd
                    /etc/passwd-
                    /etc/passwd

            注意:
                -name 'filename' : 是嚴格區分大小寫的
                -iname 'filename':檔名匹配時不區分大小寫 

            -regex pattern : 基於正則,進行檔名匹配

            -user username :根據檔案屬主查詢
                find /tmp -user hadoop
                find /tmp -user student

            -group groupname : 根據檔案屬組查詢
                -uid UID :根據uid查詢
                -gid GID  : 根據gid查詢


             注意:一個使用者被刪除後,假如還有之前他建立的檔案存在,則該檔案的屬主,同名稱的屬組,都變為數字的uid,gid了;
            所以可以通過上面的-uid,-gid查詢;
                find /tmp -uid 2003

            -nouser : 查詢沒有屬主的檔案
                find /tmp -nouser

            -nogroup : 查詢沒有屬組的檔案

            -type f(common file)/d(directory)/c(character)/b(block)/l(link)/p(pipe)/s(socket):根據檔案型別查詢
                find /tmp -type d
                find /tmp -type s


            -size [+|-]#k/M/G : 按大小查詢,預設單位為位元組;
                +10k  : 大於10k
                10k : 9k~10k的
                -10k :所有小於10k的

                find /etc -size 10k -ls


        組合條件查詢:
            -a : and ;預設
            -o :or
            -not :!

            預設就是與條件

            find /tmp -nouser -a -type d -ls
            find /tmp -nouser -o -type d -ls

        非目錄的檔案:
            find /tmp -not -type d

        不是目錄並且也不是套接字?
            find /tmp -not -type d -a -not -type s

         /tmp/test目錄下,屬主不是user1,也不是user2的檔案?
            find /tmp/test -not -user user1 -a -not -user user2

            find /tmp/test -not \( -user user1 -o -user user2 \)

        /tmp/test目錄下,屬主不是user1,或者型別不是目錄的檔案?
            find /tmp/test -not -user user1 -o -not -type d

            find /tmp/test -not \( -user user1 -a -type d \)


根據時間查詢:
        -mtime [+|-]#   修改的  單位是天
        -ctime [+|-]#   改變的 
        -atime [+|-]#   訪問的
            -atime 5  :離現在為止,剛好5-atime -55天內訪問過
            -atime +55天前訪問過

        -mmin [+|-]#    分鐘
        -cmin [+|-]#
        -amin [+|-]#

        find ./ -amin -5    5分鐘之內
        find ./ -admin 5    剛好過去5分鐘
        find ./ -admin +5   5分鐘之前

        find /tmp -atime +7
        find /tmp -atime +30
        find /usr -atime +30


根據檔案許可權查詢:
        -perm mode   精確匹配

            find ./ -perm 644

        -perm /mode   只要有一位匹配即可
            find ./ -perm /644
            任意一位匹配即滿足條件


        -perm -mode   每一位都必須匹配才行;包含關係;檔案的許可權能完全包含此mode
            如:755---644755包含644即可匹配到)
            對應的位必須完全包含


        find ./ -perm -001   查詢其它人有x許可權的

        find ./ -perm -022   組和其他人有w許可權的

        find ./ -perm /022   組或其他人有w許可權的

        find ./ -perm -007


動作:匹配查詢到後的執行動作
        -print 顯示  ; 預設
        -ls  類似ls -l 顯示每一個檔案的詳細資訊

        -ok command {} \;       每一次操作都需要使用者確認
        -exec command {} \;     不需要確認
        xargs

            {} : 引用查詢匹配到的檔案

            find ./ -perm -006 -exec chmod o-w {} \;

            找到型別是目錄的,把屬主,屬組,其它人都加上x許可權?
                find ./ -type d -ok chmod +x {} \;       


            查詢屬組有w許可權的,改名為 "原名稱.new"
            find ./ -perm -020 -exec mv {} {}.new \;


            查詢/tmp目錄下,.sh結尾的檔案,且所有使用者都有x許可權的,然後去掉其他人的x許可權?
                find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \;


1、查詢/var目錄下屬主為root並且屬組為mail的所有檔案;
    find /var -user root -group mail
    find /var -user root -a -group mail

2、查詢/usr目錄下不屬於root,bin,或student的檔案;
    find /usr -not -user root -a -not -user bin -a -not -user student
    find /usr -not \( -user root -o -user bin -o -user student \)

3、查詢/etc目錄下最近一週內內容修改過且不屬於root及student使用者的檔案;
    find /etc -mtime -7 -not \ ( -user root -o -user student \)
    find /etc -mtime -7 -not -user root -a -not -user student


4、查詢當前系統上沒有屬主或屬組且最近1天內曾被訪問過的檔案,並將其屬主屬組均修改為root;
    find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \; 

5、查詢/etc目錄下大於1M的檔案,並將其檔名寫入/tmp/etc.largefiles檔案中;
    find /etc -size +1M >> /tmp/etc.largefiles

    find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;

    find /etc -size +1M | xargs echo >> /tmp/etc.largefiles    xargs不需要佔位符{}, \;結尾了

6、查詢/etc目錄下所有使用者都沒有寫許可權的檔案,顯示出其詳細資訊;
    find /etc -not -perm /222 -ls    



特殊許可權:
SUID
SGID
Sticky

程式的安全上下文
1. 使用者啟動程式,先看是否有許可權執行程式的二進位制程式檔案;
2. 程式啟動後,屬主,屬組是啟動該程式的使用者,及其基本組
3. 假如程式想要訪問系統資源,如訪問某個目錄的內容,則要看該程式的屬主,屬組許可權是否能訪問了;


SUID :啟動程式的屬主不再是當前啟動該程式的使用者了,而是該程式檔案本身的屬主;


 [root@localhost ~]# ll /bin/cat
    -rwxr-xr-x 1 root root 25216 2011-07-22 /bin/cat
    [root@localhost ~]# ll /etc/shadow
    -r-------- 1 root root 1347 04-04 00:58 /etc/shadow

    如果其他使用者cat /etc/shadow是沒有許可權檢視的,假如給 -rwsr-xr-x /bin/cat,其它使用者能否檢視?

    chmod u+s file
    chmod u-s file
    如果file本身原來就有執行許可權,則SUID顯示為s,否則顯示SSGID :啟動程式的屬組不再是當前啟動該程式的使用者的基本組了,而是該程式檔案本身的屬組;
    chmod g+s file
    chmod g-s file

    特殊場景:開發團隊。有使用者 hadoop, hbase , hive;
        開發目錄:/tmp/project/
        希望三個使用者在/tmp/project/下都能建立檔案;三個使用者能彼此編輯檢視對方的檔案;
        甚至管理員在這裡建立檔案,這三個使用者也都能編輯;
        但是不能刪除別人的檔案?---Sticky

Sticky :在一個公共目錄,每個使用者都可以建立檔案,刪除自己的檔案,但不能刪除別人的檔案;
    通常是對目錄而言;

    chmod o+t Dir
    chmod o-t Dir

    如果原檔案有x許可權---t,否則T

000   0
001   1   t
010   2   SGID
011   3   SGID,t
100   4   SUID
101   5   SUID,t
110   6   SUID,SGID
111   7   SUID,SGID,t

4:SUID
2:SGID
1:t

chmod 1755 /backup/test   
    1:Sticky 
    755

chmod 2755 /backup/test 
    2: SGID

chmod 3755 /backup/test  
    3: SGID , Sticky

chmod 5755 /backup/test  
    5: SUID, Sticky


umask 0022    第一位就是指特殊許可權位


SUID:執行某程式時,相應程式的屬主是程式檔案自身的屬主,而不是啟動者;
    chmod u+s file
    如果file本身原來就有執行許可權,則SUID顯示為s,否則S

    期望使用者以另一個使用者的身份執行程式;

SGID : 執行某程式時,相應程式的屬組是程式檔案自身的屬組,而不是啟動者所屬的基本組;
    chmod g+s file
    chmod g-s file

Sticky : 在一個公共目錄,每個都可以建立檔案,刪除自己的檔案,但不能刪除別人的檔案;
    chmod o+t Dir
    chmod o-t Dir


練習:寫一個指令碼
寫一個指令碼,顯示當前系統上shell為-s指定型別的使用者,並統計其使用者總數。-s選項後面跟的引數必須是/etc/shells檔案中存在的shell型別,否則不執行此指令碼。另外,此指令碼還可以接受--help選項,以顯示幫助資訊。指令碼執行形如:
./showshells.sh -s bash
顯示結果形如:
BASH3users,they are:
root,redhat,gentoo


#!/bin/bash
#
if [ $1 == '-s' ]; then
  ! grep "${2}$" /etc/shells &> /dev/null && echo "Invalid shell." && exit 7
elif [ $1 == '--help' ];then
  echo "Usage: showshells.sh -s SHELL | --help"
  exit 0
else
  echo "Unknown Options."
  exit 8
fi

NUMOFUSER=`grep "${2}$" /etc/passwd | wc -l`
SHELLUSERS=`grep "${2}$" /etc/passwd | cut -d: -f1`
SHELLUSERS=`echo $SHELLUSERS | sed 's@[[:space:]]@,@g'`

echo -e "$2, $NUMOFUSER users, they are: \n$SHELLUSERS"

${變數名}

本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章