如何列出文件路径中每个组件的权限?


10

有时有必要确定路径中的哪个目录上的访问权限受到限制。这是一个例子:

$ 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系统的解决方案感兴趣。

Answers:


17

对于基本的UNIX权限(所有者/组/其他),请使用util-linux的namei一部分:

#namei -l / sys / kernel / debug / usb / devices
f:/ sys / kernel / debug / usb / devices
drwxr-xr-x根目录/
dr-xr-xr-x根root系统
drwxr-xr-x根根内核
drwx ------根root调试
drwxr-xr-x根根USB
-r--r--r--根root设备

1

下面是一个简单的类似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显示+了来自的权限字符串,则必须列出ACL getfacl才能使用它来查看完整的访问权限:

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    getfacl "$f"
    p="$f"
    f="$(dirname "$f")"
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.