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


60

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

たとえば、ユーザーjoe、ファイルがあるとします/long/path/to/file.txt。場合であってもfile.txt777にchmodedた、ジョーはまだアクセスできるようにする必要があり/long/、その後、そして/long/path/、その後/long/path/to/の前に。必要なのは、これを自動的に確認する方法です。joeアクセスできない場合、彼がどこで拒否されたかを知りたいです。たぶん彼はアクセスできますが/long/、できません/long/path/

回答:


71

使用できます

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

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

または

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

すべての所有者と許可をリストする


2
これは正しい答えです。実際、を使用namei <path> || exit 1すると、スクリプトで許可の問題を簡単に検出できます。
ロレンツォグ

5
joeがファイルにアクセスできるかどうかは直接答えません。
jfs

15

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

sudo -u joeスクリプト。ここで、スクリプトはスクリプトファイルの名前です。sudoにjoeのように振る舞うように言っているのは、スクリプトを呼び出していたのですか?
tgkprog

正確に。それを明確にするために答えを修正しました。

非絶対パスを処理するために、スクリプトにわずかな変更を加えました。

@EvanTeitelman絶対パスで、path空に初期化するつもりでしたか?または/
ジル「SO-悪であるのをやめる」

@Gilles:空にするつもりだった。この例でpath/long、ループの最初に設定されていますが、これは正しいです。path明示的に何も設定しないでください(path=)?また、の使用を簡素化してくれてありがとうtr

3

あなたの質問から得たように、(ジョーだけでなく)異なるユーザーのためにそれをチェックする必要があります。その場合、最も簡単な方法は次のように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

Joeには、読み取り許可ではなく、ディレクトリに対する実行許可が必要です。

@EvanTeitelmanはい、そうです。一定。
ラッシュ、

/root/test/test.txt(権限は次のとおりです。@rush私は、次のファイルを使用してテストしてみました075507000777)。私が発行し./script.sh /root/test/test.txt joe、それがエコーしましたoriginal file /root/test/test.txt is readable for joe。また、これをしようとしているときに、私はテストディレクトリをmisstyped: ./script.sh /root/tst/test.txt joe、それがエコーoriginal file /root/tst/test.txt is readable for joe。私は何かを見逃しましたか?
メタコーダー

@Metalcoder申し訳ありませんが、それは私のせいです。もう一つ感嘆符がありました。これは削除されました。もう一度試してみてください。今は正常に動作するはずです。
ラッシュ、

@突進しました!余分な感嘆符は、の結果を否定し-r $FILEますか?
メタコーダー

1

この機能を提供しようとする私の試みは次のとおりです。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.