권한을 역으로 재귀 적으로 확인하려면 어떻게합니까?


25

명령이 있습니다. 아파치와 함께 제공되거나 어쨌든 권한과 관련하여 권한을 확인하는 명령과 관련이 있다고 생각합니다. 내가 가지고있는 경우에 그래서 /home/foo/bar/baz그것은 권한에 대한 무엇인지 말해 줄 것이다 baz, bar, foo,와 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

필자의 예제와 매뉴얼 페이지에서 볼 수 있듯이 심볼릭 링크 만 언급 한 이전 매뉴얼 페이지를 보았지만 모든 유형의 파일과 디렉토리에 대한 단어입니다.
Steven D

나를 위해하지 :( 긴 그것은 저에게 symlinks와 같은 긴 목록을 제공합니다.
xenoterracide

어떤 버전을 사용하고 있습니까? 내가 사용하고 2.18
xenoterracide

2
게으른 사람들을 위해 namei를 사용하는 또 다른 유용한 방법. namei -l $PWD/public_html/현재 디렉토리에서 $ PWD로 현재 디렉토리에 대한 perm 목록을 가져옵니다.
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

pwd를위한 하나의 라이너로 : pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; $ (pwd)의 디렉토리; stat -c "$ (pwd) % A"수행; cd ..; 끝난; IFS = $ OIFS; popd> / dev / null
ewindisch

공백이나 글러브 문자가 포함 된 파일 이름에는 스크립트가 작동하지 않습니다.
Gilles 'SO- 악마 그만해'

질, 나는 생각하지 않습니다. 원래는 있었지만 편집 과정에서 그것을 망쳐 놓았습니다. xargs를 제거했으며 다시 제대로 작동해야합니다.
ewindisch

밀고 터지는 이유는 무엇입니까? 아니면 평가, 그 문제? 서브 쉘 (괄호)을 사용하여 모든 변경 사항을 로컬로 유지할 수 있습니다. 공백으로 디렉토리 이름을 보호 set -f하고 글 로빙을 끄 려면 큰 따옴표가 필요합니다 . cd -P모든 심볼릭 링크를 따릅니다.
Gilles 'SO- 악마 그만해'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.