*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
, while
loop 및 를 사용하기로 결정했습니다 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