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


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, 0700및 0777). 나는 발행 ./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.