Come posso controllare ricorsivamente le autorizzazioni al contrario?


25

C'è un comando, penso che venga fornito con apache, o che sia in qualche modo correlato ad esso, che controlla i permessi, fino in fondo. Quindi, se ho /home/foo/bar/bazmi dirà quali sono i permessi sono per baz, bar, foo, e home. Qualcuno sa cos'è questo comando o un altro modo di farlo? Fondamentalmente il comando inizia dall'argomento e funziona fino a /farti sapere quali sono le autorizzazioni lungo la strada in modo da poter vedere se hai un problema con le autorizzazioni.

Risposte:


28

L'utilità che potresti pensare è il nameicomando. Secondo la pagina del manuale:

Namei usa i suoi argomenti come nomi di percorso per qualsiasi tipo di file Unix (collegamenti simbolici, file, directory e così via). Namei segue quindi ciascun percorso fino a quando non viene trovato un punto terminale (un file, una directory, un dispositivo char, ecc.). Se trova un collegamento simbolico, mostriamo il collegamento e iniziamo a seguirlo, indentando l'output per mostrare il contesto.

L'output desiderato può essere ricevuto come segue:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

Il nameicomando fa parte del pacchetto software linux-util-ng . Vedi la pagina di manuale per maggiori dettagli.


potrebbe essere, sembra che lo faccia solo per i collegamenti simbolici, anche se non ricordo cosa stavo usando e se fosse su un collegamento simbolico.
— xenoterracide,

Mentre ho visto pagine di manuale più vecchie che menzionavano solo collegamenti simbolici, come mostrano sia il mio esempio sia la pagina man, sono parole per tutti i tipi di file e directory.
— Steven D,

non per me :( dà molto tempo un lungo elenco come quello, per me, con
— collegamenti

quale versione stai usando? Sto usando 2.18
— xenoterracide il

2
un altro modo utile per usare namei per coloro che sono pigri. namei -l $PWD/public_html/Dal tuo dir corrente $ PWD per ottenere l'elenco dei permanenti fino al tuo attuale dir.
— nelaaro,

7

Non sono a conoscenza di alcun comando, ma è abbastanza facile scrivere uno script:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

Esempio:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp

2

Che ne dici di una funzione bash ricorsiva per una soluzione divertente:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 

Questo è il mio preferito perché non richiede dipendenze. Potrebbe volerlo fare anche cd .. >/dev/nullse per quelli di noi con un $CDPATHset (che fa in modo che cd
— emetta la directory

2

Penso che il comando che stai cercando sia:

namei -l `pwd`

che, quando eseguito in / tmp / foo / bar, ti dà un elenco come:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar

1

Questo potrebbe essere facilmente trasformato in una fodera. Questo non è ricorsivo e dovrebbe essere un modo relativamente veloce di farlo in bash. Chiamare pwd in ogni loop non è particolarmente veloce, quindi evita se puoi.

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

Alternativa, una riga per la directory corrente.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)

È un one-liner? Ho dimenticato qualcosa?
— phunehehe,

Come one-liner per il pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; per dir in $ (pwd); do stat -c "$ (pwd)% A".; cd ..; fatto; IFS = $ OIFS; popd> / dev / null
— ewindisch

Lo script non funzionerà con nomi di file contenenti spazi o caratteri globbing.
— Gilles 'SO- smetti di essere malvagio' il

Gilles, credo di no. Inizialmente, ma l'ho modificato nel montaggio. Ho rimosso gli xargs e dovrebbe funzionare di nuovo correttamente.
— ewindisch,

Perché usare pushd e popd? O eval, del resto? È possibile utilizzare una subshell (parentesi) per mantenere locali tutti i cambiamenti. Sono necessarie doppie virgolette per proteggere i nomi delle directory con spazi e set -fper disattivare il globbing. cd -Psegue tutti i collegamenti simbolici.
— Gilles 'SO- smetti di essere malvagio' il

1

in alternativa, considerare l'utilizzo findcontac

find /path -printf '%M %u %g %p\n' | tac
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.