사용자가 주어진 파일에 액세스 할 수 있는지 확인하는 방법은 무엇입니까? 수 있습니까? 그렇지 않으면 어떤 디렉토리가

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

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



답변

당신이 사용할 수있는

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

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

또는

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

모든 소유자와 권한을 나열


답변

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


답변

귀하의 질문에서 얻은 것처럼 다른 사용자 (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


답변

이 기능을 제공하려는 시도는 다음과 같습니다. 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


답변