Come verificare se un utente può accedere a un determinato file?


60

* Le autorizzazioni utente nix sono davvero semplici, ma le cose possono diventare confuse quando devi prendere in considerazione tutto l'accesso alla directory principale prima di raggiungere un determinato file. Come posso verificare se l'utente ha abbastanza privilegi? In caso contrario, quale directory sta negando l'accesso?

Ad esempio, supponiamo un utente joee il file /long/path/to/file.txt. Anche se è file.txtstato modificato in 777, joe deve ancora poter accedere /long/, e poi /long/path/e poi /long/path/to/prima. Quello di cui ho bisogno è un modo per controllare automaticamente questo. Se joenon ha accesso, vorrei anche sapere dove gli è stato negato. Forse può accedervi /long/, ma no /long/path/.

Risposte:


71

Puoi usare

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

che genererà tutte le autorizzazioni nel percorso in un elenco verticale.

o

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

per elencare tutti i proprietari e le autorizzazioni


2
Questa dovrebbe essere la risposta giusta. Infatti, l'utilizzo namei <path> || exit 1consente di rilevare facilmente un problema di autorizzazione in uno script.
Lorenzog,

5
non risponde direttamente se joe ha accesso al file.
jfs,

15

Puoi usare bash per farlo.

$ 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

Per verificare ciò per un utente specifico, è possibile utilizzare sudo.

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

sudo -u joe script. Qui script è il nome del file di script giusto? quindi stai dicendo a sudo di comportarsi come se Joe stesse chiamando la sceneggiatura?
tgkprog,

Precisamente. Ho modificato la mia risposta per chiarirlo.

Ho apportato una leggera modifica al mio script per gestire percorsi non assoluti.

@EvanTeitelman Con un percorso assoluto, intendevi inizializzare pathper essere vuoto? o /?
Gilles 'SO- smetti di essere malvagio' il

@Gilles: intendevo che fosse vuoto. Nell'esempio, pathè impostato per /longla prima volta attorno al loop, il che è corretto. Dovrei impostare pathnulla esplicitamente ( path=)? Inoltre, grazie per aver semplificato il mio uso di tr.

3

Come ho ricevuto dalla tua domanda, dovresti verificarlo per diversi utenti (non solo joe), quindi in quel caso il modo più semplice è controllarlo ricorsivamente tramite sudo in questo modo:

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

utilizzo:

./script.sh /long/path/to/file.txt joe

Joe deve eseguire le autorizzazioni sulle directory, non le autorizzazioni di lettura.

@EvanTeitelman sì, hai ragione. Fisso.
precipita il

@rush Ho provato a testarlo utilizzando il seguente file: /root/test/test.txt (permessi sono 0755, 0700e 0777). Ho emesso ./script.sh /root/test/test.txt joee ha fatto eco original file /root/test/test.txt is readable for joe. Inoltre, durante il tentativo questo ho misstyped il dir di prova: ./script.sh /root/tst/test.txt joeed eco original file /root/tst/test.txt is readable for joe. Mi sono perso qualcosa?
Metalcoder

@Metalcoder mi dispiace, è colpa mia. C'era un'esclamazione in più. È stato rimosso ora, puoi provarlo ancora una volta, ora dovrebbe funzionare bene.
precipita il

@rush ha funzionato! Quell'esclamazione aggiuntiva annulla il risultato di -r $FILE, giusto?
Metalcoder

1

Ecco il mio tentativo di fornire questa funzionalità. Ho scelto di usare statun whileloop e dirname.

Ho creato questo 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

Lo esegui così:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.