* 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
これがこの機能を提供しようとする私の試みです。私は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