![如何列出檔案路徑中每個元件的權限?](https://rvso.com/image/1388804/%E5%A6%82%E4%BD%95%E5%88%97%E5%87%BA%E6%AA%94%E6%A1%88%E8%B7%AF%E5%BE%91%E4%B8%AD%E6%AF%8F%E5%80%8B%E5%85%83%E4%BB%B6%E7%9A%84%E6%AC%8A%E9%99%90%EF%BC%9F.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 root 根系統 drwxr-xr-x root 根內核 drwx------ root root 調試 drwxr-xr-x root root USB -r--r--r-- root 根設備
答案2
以下是一個簡單的類似 Bourne 的 shell 腳本。它透過使用命令逐漸刪除最後一個元件來遍歷路徑,dirname
直到路徑停止變化。最後你會得到/
或。.
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
ls -ld "$f"
p="$f"
f="$(dirname "$f")"
done
在一行中能夠sudo
查看具有有限存取權限的元件:
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
顯示+
在末尾,您必須使用列出 ACLgetfacl
來查看完整的存取權限:
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
getfacl "$f"
p="$f"
f="$(dirname "$f")"
done