对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
……
相关文章
相关标签/搜索