사용자가 주어진 파일에 액세스 할 수 있는지 확인하는 방법은 무엇입니까?


60

* nix 사용자 권한은 매우 간단하지만 주어진 파일에 도달하기 전에 모든 상위 디렉토리 액세스를 고려해야 할 때 상황이 복잡해질 수 있습니다. 사용자에게 충분한 권한이 있는지 어떻게 확인할 수 있습니까? 그렇지 않으면 어떤 디렉토리가 액세스를 거부합니까?

예를 들어, user joe및 file 이라고 가정 하십시오 /long/path/to/file.txt. 해도 file.txt777 chmoded 한, 조 여전히 액세스 할 수 있습니다 /long/다음, 그리고 /long/path/다음 /long/path/to/전에. 내가 필요한 것은 이것을 자동으로 확인하는 방법입니다. 경우 joe에 액세스 할 수 없습니다, 나 또한 그가 거부되었습니다 어디 있는지 알고 싶습니다. 그는 액세스 할 수 /long/있지만 액세스 할 수는 없습니다 /long/path/.

답변:


71

당신이 사용할 수있는

namei -m /path/to/really/long/directory/with/file/in

경로의 모든 권한을 세로 목록으로 출력합니다.

또는

namei -l /path/to/really/long/directory/with/file/in

모든 소유자와 권한을 나열


2
이것이 정답이어야합니다. 실제로 사용 namei <path> || exit 1하면 스크립트에서 권한 문제를 훨씬 쉽게 감지 할 수 있습니다.
lorenzog 2016 년

5
joe가 파일에 액세스 할 수 있는지 여부는 직접 응답하지 않습니다.
jfs

15

bash를 사용 하여이 작업을 수행 할 수 있습니다.

$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
    path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
    path="$path/$part"
    # Check for execute permissions
    if ! [[ -x "$path" ]] ; then
        echo "'$path' is blocking access."
    fi
done
if ! [[ -r "$file" ]] ; then
    echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt

특정 사용자에 대해이를 확인하려면을 사용할 수 있습니다 sudo.

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

sudo -u joe 스크립트. 여기서 script는 스크립트 파일의 이름입니다. 그래서 조처럼 행동하도록 sudo에게 말하는 것은 대본을 부르는 것입니까?
tgkprog

정확하게. 나는 그것을 명확히하기 위해 대답을 수정했습니다.

절대 경로가 아닌 경로를 처리하기 위해 스크립트를 약간 수정했습니다.

@EvanTeitelman 절대 경로를 사용하여 path비어 있도록 초기화 했습니까? 또는 /?
Gilles

@Gilles : 비어있는 것을 의미했습니다. 이 예에서는 루프 주변에서 처음으로 path설정되어 /long있습니다. path명시 적으로 아무것도 설정 하지 않아야 path=합니까 ( )? 또한 사용을 단순화 해 주셔서 감사합니다 tr.

3

귀하의 질문에서 얻은 것처럼 다른 사용자 (joe뿐만 아니라)를 확인해야하므로 가장 쉬운 방법은 sudo를 통해 다음과 같이 반복적으로 확인하는 것입니다.

FILE=$1 ; T_USER=$2 ;
if sudo -u $T_USER [ -r "$FILE" ] ; then
    echo "original file $1 is readable for $T_USER"
else
    while sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
    echo "only $FILE is readable for $T_USER"
fi

용법:

./script.sh /long/path/to/file.txt joe

Joe는 디렉토리에 대한 읽기 권한이 아닌 실행 권한이 필요합니다.

@EvanTeitelman 네, 맞습니다. 결정된.
러시

/root/test/test.txt (권한은 다음과 같습니다 @rush 나는 다음과 같은 파일을 사용하여 테스트하는 시도 0755, 07000777). 나는 발행 ./script.sh /root/test/test.txt joe하고 울렸다 original file /root/test/test.txt is readable for joe. 또한 이것을 시도하는 동안 테스트 디렉토리를 잘못 입력 ./script.sh /root/tst/test.txt joe했습니다 original file /root/tst/test.txt is readable for joe. 내가 놓친 것이 있습니까?
Metalcoder

@Metalcoder 죄송합니다. 제 잘못입니다. 하나의 느낌표가 추가되었습니다. 이제 제거되었으므로 한 번 더 시도해 볼 수 있습니다. 이제 제대로 작동합니다.
rush

@ 돌진했다! 그 느낌표는의 결과를 무효화합니다 -r $FILE.
메탈 코더

1

이 기능을 제공하려는 시도는 다음과 같습니다. stat, while루프 및 을 사용하기로 선택했습니다 dirname.

이 스크립트를 만들었습니다 walkdir.bash:

#/bin/bash

cwd="$1"
while [ "x$cwd" != x/ ]; do
  info=`stat "$cwd" |grep "Access: ("`
  printf "%s : %s\n" "$info" "$cwd"

  cwd=`dirname "$cwd"`;
done

당신은 다음과 같이 실행합니다 :

$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog
Access: (0700/drwx------)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root) : /home
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.