![ファイル パス内のすべてのコンポーネントの権限を一覧表示するにはどうすればよいでしょうか?](https://rvso.com/image/1388804/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E3%83%91%E3%82%B9%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
場合によっては、パス内のどのディレクトリのアクセス権が制限されているかを判断する必要があります。次に例を示します。
$ 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