Answers:
您可以使用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
path
为空吗?还是/
?
正如我从您的问题中得到的那样,您应该为不同的用户(不仅是joe)检查它,因此在这种情况下,最简单的方法是通过sudo递归检查它,如下所示:
FILE=$1 ; T_USER=$2 ;
if sudo -u $T_USER [ -r "$FILE" ] ; then
echo "original file $1 is readable for $T_USER"
else
while sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
echo "only $FILE is readable for $T_USER"
fi
用法:
./script.sh /long/path/to/file.txt joe
0755
,0700
和0777
)。我发出了./script.sh /root/test/test.txt joe
,它回响了original file /root/test/test.txt is readable for joe
。另外,在尝试此操作时,我输错了测试目录dir:,./script.sh /root/tst/test.txt joe
并回显了original file /root/tst/test.txt is readable for joe
。我错过了什么吗?
-r $FILE
,对吗?
这是我提供此功能的尝试。我选择使用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
namei <path> || exit 1
可以使您轻松地在脚本中检测权限问题。