파일 경로에서 모든 구성 요소의 권한을 나열하려면 어떻게해야합니까? 때로는 경로 액세스 권한이있는 디렉토리를 결정해야합니다. 예를

때로는 경로 액세스 권한이있는 디렉토리를 결정해야합니다. 예를 들면 다음과 같습니다.

$ 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

사용자 권한이 제한된 곳 lscat보여 주지도 않습니다 .

경로의 모든 구성 요소 (디렉토리 및 파일)에 대한 액세스 권한을 표시하는 가장 간단한 방법은 무엇입니까? 저는 주로 유닉스 계열 시스템 솔루션에 관심이 있습니다.



답변

기본 UNIX 권한 (소유자 / 그룹 / 기타) namei의 경우 util-linux의 일부인을 사용 하십시오 .

# namei -l / sys / kernel / debug / usb / devices
f : / sys / kernel / debug / usb / devices
drwxr-xr-x 루트 루트 /
dr-xr-xr-x 루트 루트 시스템
drwxr-xr-x 루트 루트 커널
drwx ------ 루트 루트 디버그
drwxr-xr-x 루트 루트 USB
-r--r--r-- 루트 루트 장치

답변

아래는 간단한 Bourne-like-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