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

對find命令按許可權查詢的進一步理解

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


find命令按檔案許可權查詢,需要用到-perm選項。-perm選項的基本用法很簡單,格式為“-perm mode”,其中mode為所要匹配的許可權,這種查詢方式實現的是精確匹配。
例如,要在/boot目錄中查詢許可權為755的普通檔案,並顯示詳細資訊。我們設定查詢條件為“-perm 755”,可以發現共找到兩個檔案,這兩個檔案的許可權都對查詢條件進行了精確匹配。

 [[email protected] ~]# 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”。如圖所示。
對find命令按許可權查詢的進一步理解

這裡重點參考採用二進位制形式表示的許可權,其中數字0表示忽略相應位置的許可權,數字1表示匹配相應位置的許可權。因而採用“220”作為許可權查詢條件進行模糊匹配時,就表示要求所有者和所屬組應具有寫許可權,而對其它的許可權則予以忽略。
理解了這點之後,“-perm /mode”和“-perm -mode”之間的區別就好理解了。“-perm /mode”要求所匹配的許可權之間是“或”的關係,“-perm -mode”則要求所匹配的許可權之間是“與”的關係。也就是說,“-perm /220”表示所有者或所屬組任何一個具有寫許可權就可以,而“-perm -220”則表示所有者和所屬組必須同時具有寫許可權。
下面通過例項進行驗證,首先我們準備一些測試檔案。

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

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

[[email protected] ~]# find /tmp/test -perm /220 -type f
/tmp/test/test1
/tmp/test/test2
/tmp/test/test3

以“-perm -220”作為條件,查詢所有者和所屬組都具有寫許可權的檔案,只有/tmp/test/test2符合查詢條件。

 [[email protected] ~]# find /tmp/test -perm -220 -type f
/tmp/test/test2

所以如果要在系統中查詢所有人都有寫許可權的目錄,則應該指定條件“-perm -222”,如果以“-perm /222”為查詢條件,則是所有者、所屬組或其他使用者中任何一個具有寫許可權都會符合要求。

 [[email protected] ~]# 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個。

[[email protected] ~]# find / -perm -4000 2> /dev/null | wc -l
27
[[email protected] ~]# 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的目錄
[[email protected] ~]# find / -perm -3000 -type d -ls 2> /dev/null
#查詢設定了SGID或是Sbit的目錄
[[email protected] ~]# 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
……