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

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

*nix 사용자 권한은 매우 간단하지만 특정 파일에 도달하기 전에 모든 상위 디렉터리 액세스 권한을 고려해야 할 때 상황이 혼란스러울 수 있습니다. 사용자에게 충분한 권한이 있는지 확인하는 방법은 무엇입니까? 그렇지 않은 경우 액세스가 거부된 디렉터리는 무엇입니까?

예를 들어 사용자 joe와 파일이 있다고 가정합니다 /long/path/to/file.txt. 777로 chmoded 되더라도 joe는 여전히 , then 및 before 에 file.txt액세스할 수 있어야 합니다 . 나에게 필요한 것은 이것을 자동으로 확인하는 방법입니다. 액세스할 수 없는 경우 거부된 위치도 알고 싶습니다. 아마도 그 사람은 그것에 접근할 수 있을 것입니다 . 그러나 그렇지 않을 수도 있습니다 ./long//long/path//long/path/to/joe/long//long/path/

답변1

액세스를 시각적으로 확인하려면 다음을 사용할 수 있습니다.

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

그러면 경로의 모든 권한이 세로 목록으로 출력됩니다.

또는

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

모든 소유자 및 권한을 나열합니다. 다른 답변에서는 이를 프로그래밍 방식으로 확인하는 방법을 설명합니다.

답변2

루트 액세스 권한이 있는 경우 해당 사용자를 가장하고 실행 test -r(읽기), test -w(쓰기) 또는 test -x(실행)을 수행하여 해당 사용자가 지정된 파일을 읽기/쓰기/실행할 수 있는지 확인합니다.

sudo -u otheruser test -w /file/to/test || {
   echo "otheruser cannot write the file"
}

답변3

이를 위해 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

답변4

이것이 이 기능을 제공하려는 나의 시도입니다. 나는 stat, whileloop 및 를 사용하기로 결정했습니다 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

관련 정보