ファイル パス内のすべてのコンポーネントの権限を一覧表示するにはどうすればよいでしょうか?

ファイル パス内のすべてのコンポーネントの権限を一覧表示するにはどうすればよいでしょうか?

場合によっては、パス内のどのディレクトリのアクセス権が制限されているかを判断する必要があります。次に例を示します。

$ ls /sys/kernel/debug/usb/devices
ls: cannot access /sys/kernel/debug/usb/devices: Permission denied
$ cat /sys/kernel/debug/usb/devices
cat: /sys/kernel/debug/usb/devices: Permission denied

どちらも、ユーザー権限が制限されている場所を示しlsません。cat

パス内のすべてのコンポーネント (ディレクトリとファイル) のアクセス権を表示する最も簡単な方法は何ですか? 私は主に Unix ライクなシステムのソリューションに興味があります。

答え1

基本的なUNIX権限(所有者/グループ/その他)についてはnameiユーティリティLinux:

# namei -l /sys/kernel/debug/usb/devices
f: /sys/kernel/debug/usb/devices
drwxr-xr-x ルート ルート /
dr-xr-xr-x ルート ルート sys
drwxr-xr-x ルート ルートカーネル
drwx------ ルート ルート デバッグ
drwxr-xr-x ルート ルート usb
-r--r--r-- root ルートデバイス

答え2

以下は、単純な Bourne のようなシェル スクリプトです。 コマンドを使用して、パスの変更が停止するまで、最後のコンポーネントを徐々に削除することでパスをトラバースします。最後に、またはのdirnameいずれかが表示されます。/.

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    ls -ld "$f"
    p="$f"
    f="$(dirname "$f")"
done

sudoアクセス権が制限されたコンポーネントを表示できるようにするには、次の 1 行を使用します。

f=/sys/kernel/debug/usb/devices p= ; while test "$f" != "$p" ; do sudo ls -ld "$f" ; p="$f" ; f="$(dirname "$f")" ; done

出力例

-r--r--r-- 1 root root 0 Dec  5 10:36 /sys/kernel/debug/usb/devices
drwxr-xr-x 3 root root 0 Dec  5 10:36 /sys/kernel/debug/usb
drwx------ 19 root root 0 Dec  5 10:36 /sys/kernel/debug
drwxr-xr-x 7 root root 0 Dec  5 10:37 /sys/kernel
drwxr-xr-x 13 root root 0 Dec  5 10:37 /sys
drwxr-xr-x 27 root root 4096 Dec  3 09:39 /

POSIX ACL

からの権限文字列が最後にls -l表示される場合は、完全なアクセス権を確認するために ACL をリストする必要があります。+getfacl

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    getfacl "$f"
    p="$f"
    f="$(dirname "$f")"
done

関連情報