1. 程式人生 > >對find命令按權限查找的進一步理解

對find命令按權限查找的進一步理解

local gid cto 用法 roc dev 驗證 成了 情況下

之前曾寫過一篇文章“根據文件屬性或權限進行find查找”,發表在《網絡安全和信息化》雜誌上,還被我轉發到了博客 http://blog.51cto.com/yttitan/1935023
本以為對find命令的-perm選項,理解還算是比較透徹了,但昨天在講課的時候才發現,有些地方難以自圓其說,自己的理解還存在一些偏差。因而重寫了之前的文章,算是校正和勘誤吧。文中所用的系統版本為CentOS7.5。


find命令按文件權限查找,需要用到-perm選項。-perm選項的基本用法很簡單,格式為“-perm mode”,其中mode為所要匹配的權限,這種查找方式實現的是精確匹配。
例如,要在/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

但在更多情況下,我們希望能夠對權限進行模糊匹配。比如查找所屬組具有寫權限的目錄,或者是查找其他用戶具有寫權限的文件等。在這些情況下,我們只關心所屬組或其他用戶是否有相應的權限,而不關心整體權限,因而這時使用精確匹配就無法滿足要求了。

-perm選項提供了兩種模糊匹配的方式:“-perm /mode”和“-perm -mode”。這兩種模糊匹配方式不是很好理解,下面先舉例說明它們之間的區別。
比如我們要查找的權限為“220”。如果用字符的形式來表示權限的話,應該是“-w--w----”。如果用二進制的形式來表示的話,應該是“010010000”。如圖所示。
技術分享圖片

這裏重點參考采用二進制形式表示的權限,其中數字0表示忽略相應位置的權限,數字1表示匹配相應位置的權限。因而采用“220”作為權限查找條件進行模糊匹配時,就表示要求所有者和所屬組應具有寫權限,而對其它的權限則予以忽略。
理解了這點之後,“-perm /mode”和“-perm -mode”之間的區別就好理解了。“-perm /mode”要求所匹配的權限之間是“或”的關系,“-perm -mode”則要求所匹配的權限之間是“與”的關系。也就是說,“-perm /220”表示所有者或所屬組任何一個具有寫權限就可以,而“-perm -220”則表示所有者和所屬組必須同時具有寫權限。

下面通過實例進行驗證,首先我們準備一些測試文件。

 [root@localhost ~]# mkdir /tmp/test
[root@localhost ~]# touch /tmp/test/test{1,2,3}
[root@localhost ~]# chmod 644 /tmp/test/test1
[root@localhost ~]# chmod 664 /tmp/test/test2
[root@localhost ~]# chmod 600 /tmp/test/test3

然後我們分別通過兩種不同的方式進行模糊匹配。
以“-perm /220”作為條件,查找所有者或所屬組具有寫權限的文件,可以看到3個測試文件均符合查找條件。

[root@localhost ~]# find /tmp/test -perm /220 -type f
/tmp/test/test1
/tmp/test/test2
/tmp/test/test3

以“-perm -220”作為條件,查找所有者和所屬組都具有寫權限的文件,只有/tmp/test/test2符合查找條件。

 [root@localhost ~]# find /tmp/test -perm -220 -type f
/tmp/test/test2

所以如果要在系統中查找所有人都有寫權限的目錄,則應該指定條件“-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

……

除了基本權限之外,find命令也支持查找特殊權限。對於特殊權限,SUID對應的數字是4,SGID對應的數字是2,粘滯位Sbit對應的數字是1。如果某個文件或目錄被設置了特殊權限,那麽它用數字形式表示的權限就成了4位數,特殊權限被放在左側最高位。比如/usr/bin/passwd文件的權限為“rwsr-xr-x”,用數字形式表示就是4755。再比如/tmp目錄的權限為“rwxrwxrwt”,用數字形式表示就是1777。
因而如果在系統中查找所有設置了SUID的文件,那麽應將查找條件設置為“4000”。由於所要查找的權限位只有1個,因而無論使用“-perm -4000”還是“-perm /4000”,都可以實現相同的效果。在CentOS7系統中,這類文件的數量是27個。

[root@localhost ~]# find / -perm -4000 2> /dev/null | wc -l
27
[root@localhost ~]# find / -perm /4000 2> /dev/null | wc -l
27

同理,如果要查找所有設置了SGID的目錄,應指定條件“-perm -2000”或是“-perm /2000”。查找設置了Sbit權限的目錄,可以指定條件“-perm -1000”或是“-perm /1000”。
如果要查找所有設置了SGID或Sbit權限的目錄,那麽應該指定條件“-perm /3000”,如果將條件指定為“-perm -3000”,則表示查找既設置了SGID同時也設置了Sbit的目錄。

 #查找同時設置了SGID和Sbit的目錄
[root@localhost ~]# find / -perm -3000 -type d -ls 2> /dev/null
#查找設置了SGID或是Sbit的目錄
[root@localhost ~]# find / -perm /3000 -type d -ls 2> /dev/null
  8400    0 drwxrwxrwt   2 root     root           40 9月 11 11:17 /dev/mqueue
  8622    0 drwxrwxrwt   2 root     root           40 9月 11 11:17 /dev/shm
  69      4 drwxrwxrwt   7 root     root         4096 10月 19 11:16 /var/tmp
……

對find命令按權限查找的進一步理解