shell 为什么要检查与0007 AND的文件权限是否正确?

z8dt9xmd  于 2023-02-09  发布在  Shell
关注(0)|答案(1)|浏览(108)

我偶然发现了这个结构:

((($(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文件权限意味着什么呢?

sycxhyv7

sycxhyv71#

  • stat -c '0%#a' "$FILE_PATH"获取文件本身的权限,并以0开头以确保它们以八进制解释。
  • stat -c '0%#a' "${FILE_PATH%/*}"获取包含该文件的目录的权限。
  • 将以上结果进行OR运算可以告诉我们以上两项中的任何一项拥有哪些权限,而将它们进行AND运算则可以告诉我们以上两项都拥有哪些权限。上述逻辑执行的是位AND运算,但如果执行位OR运算,则会更安全。
  • 0007仅查看“其他”权限:既不是所有者也不在组中的用户是否具有任何读、写或执行权限。与此集进行AND运算可告诉我们,上述操作的结果是否包括适用于既不拥有文件或目录也不与其共享组的用户的任何权限。
    如当前所写,通过将目录和文件权限进行“与”运算,然后将其与0007进行“与”运算,我们检查文件和目录是否 * 都 * 可由没有任何所有者权益的用户读取、写入或执行;但是我们错过了目录可读/可写/可执行但文件不可读、或文件不可读/可写/可执行但目录不可读的情况。
    如果通过将文件和目录权限进行“或”运算,然后将结果与0007进行“与”运算来修复此问题,则实际效果是检查文件或其包含目录是否可以由既不拥有该文件系统对象也不属于拥有该文件系统对象的组的用户读取、写入或执行(对于cd 'd到的目录)。

相关问题