web-dev-qa-db-ja.com

権限を逆に再帰的に確認するにはどうすればよいですか?

コマンドがあり、Apacheに付属している、または何らかの形でそれに関連している、アクセス権をチェックするコマンドがあると思います。したがって、/home/foo/bar/bazがある場合は、bazbarfoo、およびhomeの権限が何であるかがわかります。このコマンドが何か、またはこれを行う別の方法を知っている人はいますか?コマンドは基本的に引数から始まり、/までの方法で機能します。これにより、許可がどのようなものであるかがわかり、許可の問題があるかどうかを確認できます。

25
xenoterracide

考えているユーティリティはnameiコマンドです。マニュアルページによると:

Nameiはその引数を任意のタイプのUnixファイル(シンボリックリンク、ファイル、ディレクトリなど)へのパス名として使用します。 Nameiは、終点(ファイル、ディレクトリ、文字デバイスなど)が見つかるまで、各パス名をたどります。シンボリックリンクが見つかった場合は、リンクを表示し、リンクをたどり、出力をインデントしてコンテキストを表示します。

希望する出力は次のように受信できます。

$ 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 ソフトウェアパッケージの一部です。詳細は manual page を参照してください。

29
Steven D

コマンドは知りませんが、スクリプトを書くのは非常に簡単です。

#!/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
7
dogbane

私が探しているコマンドは次のとおりだと思います:

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
2
Christian

楽しいソリューションのための再帰的な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#] 
2
frielp

これは簡単にワンライナーにすることができます。これは再帰的ではなく、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)
1
ewindisch

または、findtacの併用を検討してください

find /path -printf '%M %u %g %p\n' | tac
1
Luca Filipozzi