*nix 用户权限非常简单,但是当您必须在到达给定文件之前考虑所有父目录访问权限时,事情可能会变得混乱。如何检查用户是否有足够的权限?如果不是,那么哪个目录拒绝访问?
例如,假设有一个用户joe
和文件/long/path/to/file.txt
。即使file.txt
被 chmoded 为 777,joe 仍然必须能够访问/long/
, then/long/path/
和 then /long/path/to/
before。我需要的是一种自动检查这一点的方法。如果joe
无法访问,我还想知道他在哪里被拒绝。也许他可以访问/long/
,但不能/long/path/
。
答案1
要直观地验证访问,您可以使用
namei -m /path/to/really/long/directory/with/file/in
这将在垂直列表中输出路径中的所有权限。
或者
namei -l /path/to/really/long/directory/with/file/in
列出所有所有者和权限。其他答案解释了如何以编程方式验证这一点。
答案2
如果您具有 root 访问权限,请模拟该用户,然后运行test -r
(读取)、test -w
(写入)或test -x
(执行)以检查用户是否可以读取/写入/执行给定文件。
sudo -u otheruser test -w /file/to/test || {
echo "otheruser cannot write the file"
}
答案3
您可以使用 bash 来执行此操作。
$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
path="$path/$part"
# Check for execute permissions
if ! [[ -x "$path" ]] ; then
echo "'$path' is blocking access."
fi
done
if ! [[ -r "$file" ]] ; then
echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt
要检查特定用户的此项,您可以使用sudo
。
sudo -u joe ./check-permissions.sh /long/path/to/file.txt
答案4
这是我提供此功能的尝试。我选择使用stat
、while
循环和dirname
。
我创建了这个脚本walkdir.bash
:
#/bin/bash
cwd="$1"
while [ "x$cwd" != x/ ]; do
info=`stat "$cwd" |grep "Access: ("`
printf "%s : %s\n" "$info" "$cwd"
cwd=`dirname "$cwd"`;
done
你像这样运行它:
$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog
Access: (0700/drwx------) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) : /home