有时需要确定路径中哪些目录的访问权限受到限制。以下是示例:
$ 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
以下部分util-linux:
# namei -l /sys/kernel/debug/usb/设备 f: /sys/内核/调试/usb/设备 drwxr-xr-x root / dr-xr-xr-x root 系统 drwxr-xr-x root 内核 drwx------ root 根调试 drwxr-xr-x root 根 usb -r--r--r-- root 根设备
答案2
下面是一个简单的 Bourne-like-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