web-dev-qa-db-ja.com

Linuxで有効なファイル権限を一覧表示するにはどうすればよいですか?

つまり:

ディレクトリのアクセス許可が700であり、ディレクトリの下のファイルが570であるとします。

その場合、ファイルの有効な権限は500です。

親のアクセス許可を再帰的にチェックすることにより、有効なアクセス許可を一覧表示するようなコマンドはありますか?

6
user1608776

特に、ファイルとディレクトリの両方に従来のアクセス許可に加えてACLが設定されている可能性があるため、そのようなコマンドはなく、簡単な方法もありません。これにより、有効なファイルのアクセス許可の計算と表示がより複雑になります。さらに、あなたの質問は、ファイルへのパスが1つであると想定していますが、パスに存在する可能性のあるシンボリックリンクは、アクセス許可が重要ではないため、最初に解決する必要があります。ファイルには複数のハードリンクがあるため、別のディレクトリからアクセスできる可能性があります。ループバック/バインドマウントが設定されているか、ユーザーがchroot環境で実行されている場合、ユーザーは別のパスを介してアクセスできる可能性もあります。

いずれにせよ、ユーザーになりすまして、特定のパスを介してアクセスしているときにファイルが読み取り可能、書き込み可能、​​および/または実行可能かどうかを確認することができます。

何かのようなもの:

#!/bin/ksh
[[ $# != 2 ]] && { echo Usage $0 user file; exit ; }
dir=$(\cd $(dirname "$2");/bin/pwd)
file=$(basename "$2")
su $1 ksh -c '
cd $2 2>/dev/null || { echo "---" ; exit ; }
[[ -r "$3" ]] && p=r || p=-
[[ -w "$3" ]] && p=${p}w || p=${p}-
[[ -x "$3" ]] && p=${p}x || p=${p}-
printf "%s %s/%s\n" $p "$2" "$3"
' "$1" "$dir" "$file"

これにより、従来のrwx構文を使用して、その特定のファイルに対するユーザーの有効な権限が表示されます。起動するユーザーにroot権限(または同等の権限)がなく、ターゲットディレクトリへの読み取りアクセス権がない場合、このスクリプトは偽陰性の結果をもたらす可能性があることに注意してください。

4
jlliagre

これを解決するのはそれほど簡単ではありません。特に、「効果的な」ファイルパーミッション(このコンテキストでは私にはわからない概念)を決定するのはそれほど簡単ではありません。

ファイルにつながるすべてのディレクトリが「実行可能」である場合、ファイルにアクセスできます。ファイルの名前がわかっている場合は、読み取りアクセスは必要ありません。

(たとえば、同じグループの他のメンバーにxアクセスを許可するために、ホームディレクトリを710にすることがあります。したがって、他の誰も私の~にあるものを見ることができませんが、次の場合に使用できます。私は彼らに何があるかを伝えます。)

質問が既存のファイルへのアクセスに関するものである場合、答えはファイルの作成または削除とは異なります。後者の場合、ファイル(予定)の親ディレクトリは書き込み可能です。

OTOH、ファイルのパスにディレクトリのxがない場合、ファイルが存在するかどうか、したがってファイルがどの権限を持っているかを判断することすらできません。その場合、有効なアクセス許可は0になると主張できますが、ファイルが存在するかどうかさえわからない場合は、ファイルのアクセス許可について何かを伝えるのは賢明ではありません。

ただし、必要に応じて、各ディレクトリのマスクを取得し、& 0111&を一緒に実行し、0があるべき場所に1がある場合は、ファイルの「有効なアクセス許可」に0を配置します。

作成および削除する場合は、親ディレクトリの有効なアクセス許可を決定し、書き込み可能で実行可能かどうかを確認します。

したがって、700ディレクトリでは、570500になります。

2
glglgl

他の答えは正しいです。ただし、bashワンライナーを使用して、ディレクトリ階層のアクセス許可を一覧表示できます。最初に問題のディレクトリに移動してから、次のコマンドを実行します。

pushd .; while [ `pwd` != / ]; do ls -ld `pwd`; cd ..; done; popd
1
Edward Anderson

namei をオプション-mまたは-lとともに使用して、自分で計算を行うことができます。

$ namei -l /home/theuser/.ssh/authorized_keys
f: /home/theuser/.ssh/authorized_keys
dr-xr-xr-x root     root  /
drwxr-xr-x root     root  home
drwx------ theuser users theuser
drwxr-xr-x theuser users .ssh
-rw------- theuser users authorized_keys
0
Andrey Regentov