IE:
假设目录权限为700
,目录下的文件为570
那么该文件的有效权限是500
是否有这样的命令,通过递归检查父权限来列出有效权限?
答案1
没有这样的命令,也没有简单的方法可以做到这一点,特别是因为文件和目录除了传统权限之外还可能设置了 ACL,这使得有效文件权限的计算和显示更加复杂。此外,您的问题假设文件只有一条路径,但路径中可能存在的符号链接应该首先解析,因为它们的权限无关紧要,文件也可能有多个硬链接,因此可以从另一个目录访问。如果存在环回/绑定挂载或用户在 chrooted 环境中运行,用户也可能能够通过不同的路径访问它。
无论如何,您可以做的是模拟用户并检查通过给定路径访问的文件是否可以由他/她读取、写入和/或执行。
就像是:
#!/bin/ksh
[[ $# != 2 ]] && { echo Usage $0 user file; exit ; }
dir=$(\cd $(dirname "$2");/bin/pwd)
file=$(basename "$2")
su $1 ksh -c '
cd $2 2>/dev/null || { echo "---" ; exit ; }
[[ -r "$3" ]] && p=r || p=-
[[ -w "$3" ]] && p=${p}w || p=${p}-
[[ -x "$3" ]] && p=${p}x || p=${p}-
printf "%s %s/%s\n" $p "$2" "$3"
' "$1" "$dir" "$file"
这将使用传统的 rwx 语法显示用户对该特定文件的有效权限。请注意,如果启动的用户没有 root 权限(或同等权限)并且没有目标目录的读取权限,则此脚本可能会给出假阴性结果。
答案2
这个问题不太容易解决。特别是“有效”文件权限(我在这个上下文中不知道这个概念)不太容易确定。
如果指向某个文件的所有目录都是“可执行的”,则您可以访问该文件。如果您知道文件的名称,则不需要读取权限。
(例如,有时,我会创建主目录710
以便让x
同一组的其他成员可以访问。因此,其他人都看不到我的目录中的内容~
,但如果我告诉他们其中有什么,他们就可以使用它。)
如果问题是关于访问现有文件,答案与创建或删除文件不同。在后一种情况下,文件的父目录必须是可写的。
另一方面,如果我没有x
文件路径中的目录,我甚至无法确定文件是否存在,因此也无法确定文件具有哪些权限。您可以争辩说,那么有效权限将是0
,但当我甚至不知道文件是否存在时,我认为告诉有关文件权限的事情是不明智的。
但是如果您愿意的话,您可以获取每个目录的掩码,将& 0111
掩码&
放在一起,如果在应该有0
a的地方有a 1
,则将a放入0
文件的“有效权限”中。
对于创建和删除,您需要确定父目录的有效权限并查看它是否可写和可执行。
因此在700
目录中,a570
变成500
。
答案3
其他答案都是正确的。但是,您可以使用 bash 单行命令列出目录层次结构的权限。首先切换到相关目录,然后运行:
pushd .; while [ `pwd` != / ]; do ls -ld `pwd`; cd ..; done; popd
答案4
您可以使用纳美使用选项 -m 或 -l,然后自己进行计算。
$ namei -l /home/theuser/.ssh/authorized_keys
f: /home/theuser/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root home
drwx------ theuser users theuser
drwxr-xr-x theuser users .ssh
-rw------- theuser users authorized_keys