根據文件屬性或權限進行find查找

原文發表於《網絡安全和信息化》2017年第3期,現轉發到博客。安全

講課過程當中發現對find命令-perm選項的理解有些誤差,將相關內容修訂以後發佈在新的博客上,http://www.javashuo.com/article/p-odnqigmg-hx.html bash


findLinux系統中功能強大的文件查找命令,它能夠實現文件的精確查找,是在平常運維工做中最常使用的命令之一。find命令支持的查找條件很是多,用法也比較複雜,其中按文件屬性或是權限進行查找就是一種相對較爲高級的find查找方法,不少初學者每每對這兩種查找方法理解和掌握不夠透徹,本文就分別梳理了如何來設定和使用這兩種查找條件。
網絡

1.    根據文件屬性查找

文件屬性主要是指文件的全部者和所屬組這兩種所屬關係。按文件屬性查找,主要有如下選項:運維

l  -user 用戶名:根據全部者查找;ide

l  -group 組名:根據所屬組查找;ui

l  -uid UID:根據UID查找;spa

l  -gid GID:根據GID查找;orm

l  -nouser:查找沒有全部者的文件;對象

l  -nogroup:查找沒有所屬組的文件。blog

例:在/home目錄下查找全部屬於用戶student的文件或目錄。


[root@localhost    ~]# find /home -user student -ls

400903    4 drwx------   4 student  student      4096 9     8 16:33 /home/student

400904    4 -rw-r--r--   1 student  student 176 1 16 2015  home/student/.bash_profile

……


例:在/var目錄中查找全部者爲root且所屬組爲mail的文件或目錄。


[root@localhost    ~]# find /var -user root -group mail    -ls

655309    4 drwxrwxr-x   2 root     mail         4096 12 23 11:24 /var/spool/mail


有時可能會遇到這樣的狀況,好比文件/tmp/test屬於zhangsan全部,若是將用戶zhangsan刪除,那麼/tmp/test的全部者和所屬組就變成了zhangsan原先的uidgid


[root@localhost    ~]# ll /tmp/test                                 //文件屬於zhangsan

-rw-r--r--. 1    zhangsan zhangsan 0 12 23 05:59 /tmp/test

[root@localhost    ~]# userdel -r zhangsan                 //刪除zhangsan用戶

[root@localhost    ~]# ll /tmp/test                                 //文件的全部者和所屬組變成了uidgid

-rw-r--r--. 1    504 504 0 12 23 05:59 /tmp/test


這時咱們也能夠經過uidgid去查找這類文件。


[root@localhost    ~]# find /tmp -uid 504 -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test


其實對於那些正常的所屬關係是用戶名或組名的文件,一樣也能夠經過uid或是gid進行查找。好比用戶studentuid500,咱們經過uid/home目錄中查找屬於student的文件。


[root@localhost    ~]# find /home -uid 500 -ls

400903    4 drwx------   4 student  student      4096 9     8 16:33 /home/student

400904    4 -rw-r--r--   1 student  student     176 1 16 2015 /home/student/.bash_profile

……


對於/tmp/test這樣的全部者和所屬組變成了uidgid的文件,就稱爲沒有全部者或所屬組的文件,這樣的文件在系統中有必定危險性,因此咱們能夠經過-nouser-nogroup選項去查找這類文件。找到這類文件以後,最好是利用chown命令從新爲其指定全部者和所屬組。


[root@localhost    ~]# find /tmp -nouser -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test

[root@localhost    ~]# find /tmp -nogroup -ls

797189    0 -rw-r--r--   1 504      504             0 12 23 12:12 /tmp/test


2.    根據文件權限查找

按文件權限查找,須要用到-perm選項,根據對權限的設置條件不一樣,該選項又分爲三種用法:

l  -perm mode:精確匹配mode所表示的條件。

l  -perm /mode:任何一類用戶(ugo)的權限中的任何一位(rwx)符合mode所表示的條件便可,9位權限之間存在「或」關係。

l  -perm -mode:任何一類用戶(ugo)的權限中的每一位(rwx)都要同時符合mode所表示的條件,9位權限之間存在「與」關係。

例如,要在/boot目錄中查找權限爲755的普通文件,並顯示詳細信息。咱們設置查找條件爲「-perm 755」,能夠發現共找到兩個文件,這兩個文件的權限都對查找條件進行了精確匹配。


[root@localhost    ~]# find /boot -perm 755 -type f -ls

 65030     250 -rwxr-xr-x   1 root   root     254248 4 7  2015    /boot/efi/EFI/redhat/grub.efi

 16 4125 -rwxr-xr-x  1 root     root  4222192 7 2 2015    /boot/vmlinuz-2.6.32-573.el6.x86_64


下面繼續在/boot目錄中查找權限爲750的目錄,可是沒有查找到任何符合條件的結果。


[root@localhost    ~]# find /boot -perm 750 -type d -ls


將查找條件修改成「-perm /750」,表示任何一個目錄只要其全部者具備讀寫執行中的任何一項權限,或是其所屬組具備讀和執行中的任何一項權限,就能夠符合查找條件。須要注意的是,查找條件中的0表示忽略對相應對象的權限要求,而不是指沒有任何權限。從新指定查找條件後,就能夠找到不少符合要求的目錄。


[root@localhost    ~]# find /boot -perm /750 -type d    -ls

     2       2 dr-xr-xr-x   5 root     root         1024 9     2 00:36 /boot

    11      13 drwx------   2 root     root        12288 9     2 00:24 /boot/lost+found

 65027       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi

……


下面再將查找條件修改成「-perm -750」,表示所要查找的目錄其全部者必須具備讀寫執行權限,同時其所屬組必須具備讀和執行權限,對其餘用戶的權限沒有要求。從查找結果中能夠發現,以前經過條件「-perm /750」所查找出來的兩個目錄「/boot」和「/boot/lost+found」,此時都不在查找結果之列。


[root@localhost    ~]# find /boot -perm -750 -type d    -ls

 65027       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi

 65028       2 drwxr-xr-x   3 root     root         1024 9     2 00:33 /boot/efi/EFI

 65029       2 drwxr-xr-x   2 root     root         1024 9     2 00:33 /boot/efi/EFI/redhat


因此若是要在系統中查找全部人都有寫權限的目錄,則應該指定條件「-perm -222」,若是以「-perm /222」爲查找條件,則是全部者、所屬組或其餘用戶中任何一個具備寫權限都會符合要求。


[root@localhost    ~]# find / -perm -222 -type d -ls    2> /dev/null

  6810       0 drwxrwxrwt   2 root     root          100 12 23 03:37 /dev/shm

654108    4 drwxrwxrwt   2 root     root         4096 12 23 03:42 /var/tmp

784897    4 drwxrwxrwt  12 root     root         4096 12 23 06:58 /tmp

……


除了讀寫執行這些常規權限以外,Linux系統還提供了特殊權限SUIDSGID,它們所對應的數字分別是42。若是要在系統中查找全部設置了SUID的文件,應指定條件「-perm -4000」。


[root@localhost    ~]# find / -perm -4000 –ls 2>    /dev/null

788976   40 -rwsr-xr-x   1 root        root        38200 12 11     2014 /bin/ping

788990   76 -rwsr-xr-x   1 root     root        77336 8 11     2014 /bin/mount

……


若是要查找全部設置了SGID的文件,應指定條件「-perm -2000」。


[root@localhost    ~]# find / -perm -2000 –ls 2>    /dev/null

784944   16 -rwxr-sr-x   1 root        cgred       16384 1     6  2015 /bin/cgexec

784971   16 -rwxr-sr-x   1 root     cgred       16352 1     6  2015 /bin/cgclassify

……


若是要同時查找全部設置了SUID或是SGID的文件,那麼應該指定條件「-perm /6000」,若是將條件指定爲「-perm -6000」,則表示查找既設置了SUID也設置了SGID的文件,而這樣的文件在系統中是不存在的。


[root@localhost    ~]# find / -perm -6000 –ls 2>    /dev/null

 //查找同時設置了SUIDSGID的文件,沒有結果。

[root@localhost    ~]# find / -perm /6000 –ls 2>    /dev/null

//查找設置了SUID或是SGID的文件

788976   40 -rwsr-xr-x   1 root     root        38200 12 11     2014 /bin/ping

788990   76 -rwsr-xr-x   1 root     root        77336 8 11     2014 /bin/mount

……

相關文章
相關標籤/搜索