如何检查用户是否可以访问给定文件?

如何检查用户是否可以访问给定文件?

*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

这是我提供此功能的尝试。我选择使用statwhile循环和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

相关内容