web-dev-qa-db-ja.com

ユーザーが特定のファイルにアクセスできるかどうかを確認するにはどうすればよいですか?

* nixのユーザー権限は非常にシンプルですが、特定のファイルに到達する前にすべての親ディレクトリへのアクセスを考慮する必要がある場合、状況が複雑になる可能性があります。ユーザーに十分な権限があるかどうかを確認するにはどうすればよいですか?そうでない場合、どのディレクトリがアクセスを拒否していますか?

たとえば、ユーザーjoeとファイル/long/path/to/file.txtがあるとします。 file.txtが777に変更された場合でも、joeは以前に/long/、次に/long/path/、次に/long/path/to/にアクセスできる必要があります。これを自動的にチェックする方法が必要です。 joeがアクセスできない場合、私は彼がどこで拒否されたかを知りたいです。多分彼は/long/にアクセスできますが、/long/path/にはアクセスできません。

66
Metalcoder

使用できます

namei -m /path/to/really/long/directory/with/file/in

これにより、パス内のすべての権限が垂直のリストに出力されます。

または

namei -l /path/to/really/long/directory/with/file/in

すべての所有者と権限をリストするには

78
exussum

これを行うには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
16
user26112

私はあなたの質問から得たように、異なるユーザー(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
4
rush

Rootアクセス権がある場合は、ユーザーを偽装し、test -r(読み取り)、test -w(書き込み)、またはtest -x(実行)を実行して、ユーザーが読み取り/書き込み/実行できるかどうかを確認します指定されたファイル。

Sudo -u otheruser test -w /file/to/test
2
Kevin Burke

これが、この機能を提供するための私の試みです。私は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
1
slm