提醒:下面的几篇文章关于权限-perm的理解是完全一样的。
前言:今天被find命令的-perm /mode这个困扰了半天,最后打算上网查,然后查到了这个文章。帮我彻底理解了这个情况,当然了,对于不熟悉二进制的同志们来说,不好理解,但是只要熟悉二进制记法,再好理解不过了。
网站找到的文章一:
链接地址:关于 find中 perm 的理解_51CTO博客_find perm
关于find命令中-perm中+- 的含义
举个例子:比如当前目录下有a b c d4个文件
a文件的权限为6000 也就是a文件仅有suid sgid的特殊权限
b文件的权限为2000 也就是b文件仅有sgid的特殊权限
c文件的权限为4000 也就是c文件仅有suid的特殊权限
d文件的权限为6600 也就是d文件有sgid suid的特殊权限并且该文件拥有者对该文件有读写权限
那么现在find . -type f -perm 6000 可以找到a文件,因为a文件权限为6000
那么现在find . -type f -perm -6000 可以找到a d两个文件,这是因为:
我们可以先将a b c d这4个文件的权限转化为2进制那么,
a权限转为2进制后为 110 000 000 000
b权限转为2进制后为 010 000 000 000
c权限转为2进制后为 100 000 000 000
d权限转为2进制后为 110 110 000 000
在find . -type f -perm -6000 中的6000权限转为2进制为110 000 000 000,那么6000前的-号代表缺一不可,也就是如果有1的地方必须有1,那么这里找-6000权限的文件,这6000权限里前面有2个位置都是1,所以这里find找-6000权限的文件就是找前面2个位置都是1的文件.而只有a d这两个文件前2个位置都是1,所以find . -type f -perm -6000 只会找到a d两个文件.
find . -type f -perm +6000会找到a b c d这4个文件,这是因为:
+6000里的这个+号代表有1即可,也就是有1的位置只要有1就可以.那么这里找+6000权限的文件,这6000权限前面2个位置都有1,所以这里find找+6000权限的文件就是找前面2个位置只要有一个位置有1的文件就可以了,这4个文件都符合要求所以最后都能被 find . -type f -perm +6000找到
注意:现在大部分linux的find命令已经没有了-perm +mode这个情况,这个情况用-perm /mode替代了。所以文章中的-perm +mode可以帮助我们理解-perm /mode。
网上找到的文章二:
链接地址:通过权限查文件之find -perm解析_Mumug2的博客-CSDN博客
以下find命令默认-name “*” -ls
1、完全匹配find -perm 644
该模式完全按照文件权限严格匹配,只有644权限的文件才会被匹配
2、find -perm -644
该方式为模式匹配,何为模式?
644 = rw-r–r-- 即 101100100 #二进制模式
此方式可以匹配那些在1位上匹配的文件(夹),而0位则不不需要匹配,因此上诉匹配的结果是那些权限大于等于644的文件(夹)
3、find -perm /007
007 = ------rwx 即 000000111
文件权限二进制表示中,至少有一个1与上述mode权限匹配
该模式匹配的是对其他用户有任意权限的文件
总结:这两个文章的理解是一样的。
网上找到文章三:
find -perm,根据文件的权限来查找文件,有三种形式:
find -perm mode
find -perm -mode
find -perm +mode
find -perm mode , 表示严格匹配
find -perm -mode , 表示mode中转换成二进制的1在文件权限位里面必须匹配
find -perm +mode , 与 -mode的区别是+mode只需其中的任意一个1的部分被匹配
网上文章四:
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。
如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
de>$ find . -perm 755 -printde>
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
de># ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./tempde>
-perm mode:文件许可正好符合mode
-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode
我们首先创建下面的一个例子
#ls -l ./testdir
——S— 1 root root 0 2008-05-06 10:39 2000
—S—— 1 root root 0 2008-05-06 10:39 4000
—S–S— 1 root root 0 2008-05-06 10:39 6000
-rwS–S— 1 root root 0 2008-05-06 10:39 6600
我创建了4个文件,都具有suid/sgid位。
假定我执行
find . -type f -perm 6000
那么我们显然可以得到下面的结果
./60000
这属于完全匹配。
如果执行find . -type f -perm -6000呢,其结果是:
./6000
./6600
这里的-号表示有1的位置一定要正确匹配,其他无所谓。这里要转成二进制来说,首先6000转成三位的二进制是下面这个样子
110 000 000 000
这表示前面两个1一定要匹配,其他无所谓。那能匹配的就是6000,6600两个文件,其权限二进制转换过来分别是
110 000 000 000
110 110 000 000
而如果是执行find . -type f -perm +6000呢,结果会怎样?
我们看看结果
./6000
./2000
./4000
./6600
+号的意思是,只要有一个1匹配就行了,也就是说前2位中,只要有一个1就行,所以上面的都符合要求,因为翻译成二进制变成
110 000 000 000
010 000 000 000
100 000 000 000
110 110 000 000
所以,从上面的结果可以看出,命令find . -type f -perm +6000就是指定目录下所有具有suid/sgid的程序。
这是在做安全维护的时候,应该常使用的一个指令。我们首先创建下面的一个例子
#ls -l ./testdir
——S— 1 root root 0 2008-05-06 10:39 2000
—S—— 1 root root 0 2008-05-06 10:39 4000
—S–S— 1 root root 0 2008-05-06 10:39 6000
-rwS–S— 1 root root 0 2008-05-06 10:39 6600
我创建了4个文件,都具有suid/sgid位。
假定我执行
find . -type f -perm 6000
那么我们显然可以得到下面的结果
./60000
这属于完全匹配。
如果执行find . -type f -perm -6000呢,其结果是:
./6000
./6600
这里的-号表示有1的位置一定要正确匹配,其他无所谓。这里要转成二进制来说,首先6000转成三位的二进制是下面这个样子
110 000 000 000
这表示前面两个1一定要匹配,其他无所谓。那能匹配的就是6000,6600两个文件,其权限二进制转换过来分别是
110 000 000 000
110 110 000 000
而如果是执行find . -type f -perm +6000呢,结果会怎样?
我们看看结果
./6000
./2000
./4000
./6600
+号的意思是,只要有一个1匹配就行了,也就是说前2位中,只要有一个1就行,所以上面的都符合要求,因为翻译成二进制变成
110 000 000 000
010 000 000 000
100 000 000 000
110 110 000 000
所以,从上面的结果可以看出,命令find . -type f -perm +6000就是指定目录下所有具有suid/sgid的程序。
这是在做安全维护的时候,应该常使用的一个指令
关于更多find函数的信息,这里我找到了一个博客,里面内容精简而且明确。