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.