Como verificar se um usuário pode acessar um determinado arquivo?

52

As permissões do usuário nix são realmente simples, mas as coisas podem ficar confusas quando você precisa levar em conta todo o acesso ao diretório pai antes de acessar um determinado arquivo. Como posso verificar se o usuário tem privilégios suficientes? Se não, então qual diretório está negando o acesso?

Por exemplo, suponha que um usuário joe e o arquivo /long/path/to/file.txt . Mesmo se file.txt foi chmoded para 777, joe ainda tem que ser capaz de acessar /long/ e, em seguida, /long/path/ e, em seguida, /long/path/to/ antes. O que eu preciso é uma maneira de verificar isso automaticamente. Se joe não tiver acesso, também gostaria de saber onde ele foi negado. Talvez ele possa acessar /long/ , mas não /long/path/ .

    
por Metalcoder 09.07.2013 / 16:05

4 respostas

56

Você pode usar

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

que produzirá todas as permissões no caminho em uma lista vertical.

ou

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

para listar todos os proprietários e as permissões

    
por 26.09.2014 / 10:48
14

Você pode usar o bash para fazer isso.

$ 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

Para verificar isso para um usuário específico, você pode usar sudo .

sudo -u joe ./check-permissions.sh /long/path/to/file.txt
    
por 09.07.2013 / 16:19
3

Como eu cheguei da sua pergunta, você deve verificar isso para diferentes usuários (não apenas joe), então, nesse caso, a maneira mais fácil é recursivamente checar via sudo assim:

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

uso:

./script.sh /long/path/to/file.txt joe
    
por 09.07.2013 / 16:18
1

Aqui está minha tentativa de fornecer essa funcionalidade. Eu optei por usar stat , while loop e dirname .

Eu criei este script, 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

Você o executa assim:

$ 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
    
por 09.07.2013 / 22:56