ユーザーが特定のファイルにアクセスできることを確認する方法は?

ユーザーが特定のファイルにアクセスできることを確認する方法は?

* nixユーザー権限は非常に簡単ですが、特定のファイルに到達する前にすべての親ディレクトリアクセス権を考慮する必要がある場合、状況は混乱する可能性があります。ユーザーに十分な権限があることを確認するには?それ以外の場合、アクセスが拒否されたディレクトリは何ですか?

たとえば、ユーザーjoeとファイルがあるとします/long/path/to/file.txt。 777にchmodedされても、joeはまだthenとbeforeにfile.txtアクセスできるはずです。私にとって必要なのは、これを自動的に確認する方法です。アクセスできない場合は、拒否された場所も知りたいです。おそらくその人はそれにアクセスできるでしょう。しかしそうではないかもしれません。/long//long/path//long/path/to/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

関連情報