* nixのユーザー権限は非常にシンプルですが、特定のファイルに到達する前にすべての親ディレクトリへのアクセスを考慮する必要がある場合、状況が複雑になる可能性があります。ユーザーに十分な権限があるかどうかを確認するにはどうすればよいですか?そうでない場合、どのディレクトリがアクセスを拒否していますか?
たとえば、ユーザーjoe
とファイル/long/path/to/file.txt
があるとします。 file.txt
が777に変更された場合でも、joeは以前に/long/
、次に/long/path/
、次に/long/path/to/
にアクセスできる必要があります。これを自動的にチェックする方法が必要です。 joe
がアクセスできない場合、私は彼がどこで拒否されたかを知りたいです。多分彼は/long/
にアクセスできますが、/long/path/
にはアクセスできません。
使用できます
namei -m /path/to/really/long/directory/with/file/in
これにより、パス内のすべての権限が垂直のリストに出力されます。
または
namei -l /path/to/really/long/directory/with/file/in
すべての所有者と権限をリストするには
これを行うには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
私はあなたの質問から得たように、異なるユーザー(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
Rootアクセス権がある場合は、ユーザーを偽装し、test -r
(読み取り)、test -w
(書き込み)、またはtest -x
(実行)を実行して、ユーザーが読み取り/書き込み/実行できるかどうかを確認します指定されたファイル。
Sudo -u otheruser test -w /file/to/test
これが、この機能を提供するための私の試みです。私は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