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

以前曾寫過一篇文章「根據文件屬性或權限進行find查找」,發表在《網絡安全和信息化》雜誌上,還被我轉發到了博客 http://www.javashuo.com/article/p-drmzyrhi-z.html
本覺得對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」。如圖所示。
對find命令按權限查找的進一步理解ide

這裏重點參考採用二進制形式表示的權限,其中數字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個測試文件均符合查找條件。code

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

以「-perm -220」做爲條件,查找全部者和所屬組都具備寫權限的文件,只有/tmp/test/test2符合查找條件。blog

[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

……get

除了基本權限以外,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的目錄。it

#查找同時設置了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
……
相關文章
相關標籤/搜索