原文發表於《網絡安全和信息化》2017年第3期,現轉發到博客。安全
講課過程當中發現對find命令-perm選項的理解有些誤差,將相關內容修訂以後發佈在新的博客上,http://www.javashuo.com/article/p-odnqigmg-hx.html bash
find是Linux系統中功能強大的文件查找命令,它能夠實現文件的精確查找,是在平常運維工做中最常使用的命令之一。find命令支持的查找條件很是多,用法也比較複雜,其中按文件屬性或是權限進行查找就是一種相對較爲高級的find查找方法,不少初學者每每對這兩種查找方法理解和掌握不夠透徹,本文就分別梳理了如何來設定和使用這兩種查找條件。
網絡
文件屬性主要是指文件的全部者和所屬組這兩種所屬關係。按文件屬性查找,主要有如下選項:運維
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原先的uid和gid。
[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 //文件的全部者和所屬組變成了uid和gid -rw-r--r--. 1 504 504 0 12月 23 05:59 /tmp/test |
這時咱們也能夠經過uid或gid去查找這類文件。
[root@localhost ~]# find /tmp -uid 504 -ls 797189 0 -rw-r--r-- 1 504 504 0 12月 23 12:12 /tmp/test |
其實對於那些正常的所屬關係是用戶名或組名的文件,一樣也能夠經過uid或是gid進行查找。好比用戶student的uid是500,咱們經過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這樣的全部者和所屬組變成了uid和gid的文件,就稱爲沒有全部者或所屬組的文件,這樣的文件在系統中有必定危險性,因此咱們能夠經過-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 |
按文件權限查找,須要用到-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系統還提供了特殊權限SUID和SGID,它們所對應的數字分別是4和2。若是要在系統中查找全部設置了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 //查找同時設置了SUID和SGID的文件,沒有結果。 [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 …… |