对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”。如图所示。

这里重点参考采用二进制形式表示的权限,其中数字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
……

原文地址:http://blog.51cto.com/yttitan/2306703

时间: 2024-08-10 14:58:21

对find命令按权限查找的进一步理解的相关文章

linux命令之——权限管理命令

linux命令之——权限管理命令 权限管理命令:chmod 英文名称:chmod 命令英文原意:change the permissions mode of a file 命令所在路径: /bin/chmod 执行权限: 所有用户 语法: chmod[{ugoa}{+-=}{rwx}][文件或目录] [mode=421][文件或目录] -R 递归修改 功能描述: 改变文件或目录权限 范例 : 方式一:   chmod u+x Japanlovestory.list      对Japanlove

Mac上通过Linux命令行批量查找和替换文本

一般在本地电脑上批量替换文本有许多工具可以做到,比如Emeditor,sublime text ,但在linux和mac上相关的编辑器有这个功能的不多,另外大多服务器上都是无图形界面的,因此收集了几条针对linux命令行备忘,实现批量替换文本内容的命令: 批量查找某个目下文件的包含的内容 grep -rn "要找查找的文本" ./ 通过sed批量查找并替换文件内容. sed -i "s/要找查找的文本/替换后的文本/g"grep -rl "要找查找的文本&

seach tree的deletion的实现——对树的指针的进一步理解

一颗binary search tree,我们要在其中删除node1.而node1对应的key是,比如说,key1.删除的基本想法是什么呢? 1.找到key1对应的那个node在哪里.这个用一个迭代就可以完成了. 2.删掉这个node (1)如果这个node没有左右子树,那么直接删掉就好了. (2)如果这个node只有左子树或者右子树,那么直接让左右子树缩进上来就好了. (3)如果既有左子树又有右子树,那么就从左子树里面找出最大的node,用这个node来替换掉需要删除的那个节点. 举个栗子:有

堆排序的进一步理解

堆-顾名思义,上面小,下面大,或者上面大,下面小. 在堆排序过程中,首先应该建堆.如何将数组中的元素建立成一个规范的堆行结构. 二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 假设根结点的下标为1,则第 i 个结点的父结点下标为

C#中委托的进一步理解

文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. 代码如下: public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: 代码如下: public class AssembleIphoneHandler : System.MulticastDelegate { }

Java内存管理的进一步理解-模拟过程图解

Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      (1):基本信息:      1)每个类的全限定名       2)每个类的直接超类的全限定名(可约束类型转换)      3)该类是类还是接口      4)该类型的访问修饰符      5)直接超接口的全限定名的有序列表      (2):每个已装载类的详细信息:      1)运行时常量池:

Linux常用命令与权限简析

1.文件权限处理( ll 命令可查看当前文件的具有的权限) drwxr-xr-x. 2 root root 12288 Dec 21 11:49 bin 所属组 所属用户 文件大小 文件最后更改时间 drwxr-xr-x:(d表示文件夹,后面三个一组表示权限): d:表示 bin为 文件夹 rwx:表示 具有读写执行即 111(二进制数)--->7(十进制数) :第一部分 代表 文件所属者 具有的权限 r-x:表示 具有读 不能写 执行权限 101---->6 :第二部分 代表 用户组的权限

用户命令、权限、IO重定向、grep

/etc/passwd:用户名:密码:UID:GID:注释:家目录:默认SHELL/etc/group:组名:密码:GID:以此组为其附加组的用户列表/etc/shadow:用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:用户管理:useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage创建用户:useradd [options] USERNAME-u UID:手动给用户指定

linux常用命令修改权限查看文档

一.>和>>指令 >用于将执行结果写入后面的文件中: 把前方语句的结果存进文件,若文件不存在会自动创建 >:输出重定向 会覆盖原来文件内容 >>:追加重定向 追加到文件末尾 可以将查询的结果写入文件,可以配合echo创建一个空文件: echo “” > a.txt 二.echo指令 把内容输入到控制台 可以输入文件路径: 如下: echo "我是杨家三少" echo $PATH 三.head指令 head用于文件的开头部分内容,可以设置显