我偶然发现了这个结构:
((($(stat -c '0%#a' "$FILE_PATH") & $(stat -c '0%#a' "${FILE_PATH%/*}") & 0007) == 0))
我知道第一个括号部分返回的是八进制的文件权限位,第二个路径返回的是文件的文件夹(Linux中的所有东西都是文件)权限。但是最后一个按位操作是做什么的?是检查一些漏洞吗?
我看到第一个stat -c "0%#a" file
返回00640,stat -c "0%#a" file_path
返回00640,0007是整个表达式00640 & 00640 & 0007 = 0,但是它对于Linux文件权限意味着什么呢?
1条答案
按热度按时间sycxhyv71#
stat -c '0%#a' "$FILE_PATH"
获取文件本身的权限,并以0开头以确保它们以八进制解释。stat -c '0%#a' "${FILE_PATH%/*}"
获取包含该文件的目录的权限。0007
仅查看“其他”权限:既不是所有者也不在组中的用户是否具有任何读、写或执行权限。与此集进行AND运算可告诉我们,上述操作的结果是否包括适用于既不拥有文件或目录也不与其共享组的用户的任何权限。如当前所写,通过将目录和文件权限进行“与”运算,然后将其与
0007
进行“与”运算,我们检查文件和目录是否 * 都 * 可由没有任何所有者权益的用户读取、写入或执行;但是我们错过了目录可读/可写/可执行但文件不可读、或文件不可读/可写/可执行但目录不可读的情况。如果通过将文件和目录权限进行“或”运算,然后将结果与
0007
进行“与”运算来修复此问题,则实际效果是检查文件或其包含目录是否可以由既不拥有该文件系统对象也不属于拥有该文件系统对象的组的用户读取、写入或执行(对于cd 'd到的目录)。