如何递归地反向检查权限?


25

有一个命令,我认为它是apache附带的,或者某种程度上与其相关的命令,它一直检查权限。所以,如果我有/home/foo/bar/baz,它会告诉我什么权限是bazbarfoo,和home。有谁知道这个命令是什么或另一种方式呢?该命令基本上从参数开始,并且一直到/告诉您权限是什么的方式工作,以便您可以查看是否存在权限问题。

Answers:


28

您可能正在考虑的实用程序是namei命令。根据手册页:

Namei将其参数用作任何类型的Unix文件(符号链接,文件,目录等)的路径名。然后,Namei跟随每个路径名,直到找到终点(文件,目录,char设备等)为止。如果找到符号链接,我们将显示该链接,然后开始跟随它,缩进输出以显示上下文。

可以按以下方式接收所需的输出:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

namei命令是linux-util-ng软件包的一部分。有关更多详细信息,请参见 手册页


可能是,似乎它仅对符号链接有用,尽管我不记得自己在使用什么以及它是否在符号链接上。
xenoterracide

正如我的示例和手册页所示,虽然我看到的旧手册页只提到符号链接,但它表示所有类型的文件和目录。
史蒂文D

不适合我:(它长给出了一个长列表一样,对我来说,用符号链接。
xenoterracide

您使用什么版本?我正在使用2.18
xenoterracide 2011年

2
对懒惰的人使用namei的另一种有用方法。 namei -l $PWD/public_html/从您当前的目录中,我们$ PWD获取直到您当前目录的权限列表。
nelaaro

7

我不知道任何命令,但是编写脚本非常容易:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

例:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp

2

一个有趣的解决方案的递归bash函数如何:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 

这是我的最爱,因为它不需要依赖项。可能想为cd .. >/dev/null我们这些人$CDPATH设置一个集合(这会使cd在使用时输出当前目录,并且会干扰函数的输出。)
beporter

2

我认为您要查找的命令是:

namei -l `pwd`

在/ tmp / foo / bar中执行时,它会为您提供如下清单:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar

1

这很容易做成单线。这不是递归的,应该是在bash中相对快速的方法。在每个循环中调用pwd并不是特别快,因此请尽量避免。

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

另一种方法是,为当前目录添加一列。

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)

那是一线吗?我错过了什么?
phunehehe 2011年

作为pwd的单行代码:push $(pwd)> / dev / null; OIFS = $ IFS; IFS =“ /”; $(pwd)中的dir; 做stat -c“ $(pwd)%A”。cd ..; 完成 IFS = $ OIFS; popd> / dev / null
ewindisch 2011年

您的脚本不适用于包含空格或通配符的文件名。
吉尔斯(Gilles)“所以,别再邪恶了”,

吉尔,我想不是。它本来就是,但是我在编辑中把它搞糟了。我删除了xargs,它应该可以再次正常工作。
ewindisch 2011年

为什么要使用push和popd?或评估,就此而言?您可以使用子外壳(括号)将所有更改保持在本地。您需要双引号来保护目录名称以空格,并set -f关闭glob。cd -P遵循所有符号链接。
吉尔(Gilles)'所以

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.