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


25

コマンドがあります。Apacheに付属している、または何らかの形でそれに関連している、アクセス許可をすべて確認するコマンドがあります。私が持っているのであれば/home/foo/bar/baz、それは権限がためのものであるものを私に教えてくれますbazbarfoo、とhome。誰もこのコマンドが何であるか、これを行う別の方法を知っていますか?コマンドは基本的に引数で始まり/、権限の問題を確認できるように、権限が途中で何であるかを知らせるまで機能します。

回答:


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

私のためではありません:(それは私にとって、そのような長いリストをシンボリックリンクで
与え

どのバージョンを使用していますか?私が使用している2.18
xenoterracide

2
怠け者のためにnameiを使用する別の便利な方法。 namei -l $PWD/public_html/現在のディレクトリから$ PWDを使用して、現在のディレクトリまでのパーマのリストを取得します。
ネラアロ

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)

それはワンライナーですか?私は何か見落としてますか?
プネヘヘ

pwdのワンライナーとして:pushd $(pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; dir for $(pwd); do stat -c "$(pwd)%A"。; cd ..; 完了; IFS = $ OIFS; popd> / dev / null
ewindisch

スクリプトは、スペースまたはグロビング文字を含むファイル名では機能しません。
ジル 'SO-悪であるのをやめる'

ジル、私はそうは思わない。それはもともとあったが、私は編集でそれを台無しにした。xargsを削除したので、再び正常に機能するはずです。
-ewindisch

pushdとpopdを使用する理由 それとも、評価については?サブシェル(括弧)を使用して、すべての変更をローカルに保持できます。ディレクトリ名をスペースで保護set -fし、グロビングを無効にするには、二重引用符が必要です。cd -Pすべてのシンボリックリンクに従います。
ジル「SO-停止されて悪」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.