Come posso ottenere i permessi dei file ottali dalla riga di comando?

311

C'è un comando chmod per impostare i permessi dei file, ma posso ottenere i permessi dei file in modalità ottale (come 755) dalla riga di comando?

    
posta Anwar 17.06.2012 - 10:04

6 risposte

447

Puoi provare

stat -c "%a %n" *

Sostituisci * con la directory pertinente o il nome esatto del file che vuoi esaminare.

Dalla pagina man di stat ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Utilizzo:

  • Con file:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Con cartelle:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(riferimento)

    
risposta data jokerdino 17.06.2012 - 10:08
37

I permessi dei file in Linux possono essere visualizzati in formato ottale usando il comando stat di Linux.

Premi semplicemente Ctrl + Alt + T sulla tastiera per aprire Terminal. Quando si apre, vai alla directory in cui vuoi trovare i permessi dei file in modalità ottale.

stat -c '%A %a %n' *

% A Diritti di accesso in forma leggibile dall'uomo

% a Diritti di accesso in ottale

% n Nome file

  

Numeri ottali e autorizzazioni

     

Puoi utilizzare il numero ottale per rappresentare modalità / permesso:

r: 4
w: 2
x: 1
     

Ad esempio, per il proprietario del file è possibile utilizzare la modalità ottale come segue. Leggere,   scrivere ed eseguire il permesso (completo) su un file in ottale è 0 + r + w + x =   0 + 4 + 2 + 1 = 7

     

Solo il permesso di lettura e scrittura su un file in ottale è 0 + r + w + x = 0 + 4 + 2 + 0   = 6

     

Solo leggere ed eseguire il permesso su un file in ottale è 0 + r + w + x =   0 + 4 + 0 + 1 = 5

     

Usa il metodo sopra per calcolare il permesso per il gruppo e gli altri. Lasciateci   dì che desideri dare il pieno permesso al proprietario, leggi & amp; eseguire   permesso di raggruppare e leggere solo il permesso per gli altri, quindi è necessario   per calcolare il permesso come segue: Utente = r + w + x = 0 + 4 + 2 + 1 = 7 Gruppo =   r + w + x = 0 + 4 + 2 + 0 = 6 Altro = r + w + x = 0 + 0 + 0 + 1 = 1

     

L'autorizzazione effettiva è 761.

Fonte: link

    
risposta data Mitch 17.06.2012 - 10:14
32

Come descritto dettagliatamente in "autorizzazioni in stile 755" con "ls" da Adam Courtemanche su AgileAdam.com , puoi creare un alias lso che agisce come ls -l ma elabora leggermente l'output 1 per visualizzare le autorizzazioni anche in ottale. Aggiunge una colonna guida che mostra le autorizzazioni ottali a tre cifre 2 . Come scritto, questo funziona per la maggior parte dei file e delle directory, ma non funziona correttamente se è appiccicoso o setuid/setgid i bit sono impostati. 3

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

Questo ha una grave lacuna, tuttavia, come techtonik indica . non puoi passare argomenti a questo lso alias come faresti con il comando ls , perché sono considerati come argomenti aggiuntivi per awk . Pertanto non puoi eseguire lso su uno specifico file o directory, né puoi passare alcuna opzione (come -F o --color ) a lso .

La correzione consiste nel definire lso come funzione anziché un alias.

lso() { ls -alG "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Se stai provando questo in modo interattivo nella tua shell, esegui unalias lso per rimuovere l'alias: puoi farlo prima o dopo aver definito la funzione. Se lo inserisci in un file di origine, ad esempio ~/.bashrc , elimina la riga alias e aggiungi la definizione della funzione.

Perché funziona? A differenza degli alias, le funzioni bash shell possono assumere parametri posizionali , cioè, argomenti della riga di comando . "[email protected]" si espande alla lista di argomenti completa , causando argomenti alla% co_de Funzione% da passare a lso . (A differenza di una definizione di alias, un corpo di funzione non è quotato, quindi era necessario rimuovere i caratteri ls prima di \ e $ .)

Dato che puoi passare le opzioni a " quando definito in questo modo come funzione, potresti voler rimuovere le opzioni lso e -a dalla definizione - puoi passarle manualmente nei casi in cui le vuoi . ( L'opzione -G è richiesta per i dettagli come i permessi dei file da mostrare a tutti , quindi non c'è alcun vantaggio per rimuoverlo.)

lso() { ls -l "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Grazie a techtonik per sottolineando la limitazione nel definire -l come un alias, motivandomi così a espandi questo post con materiale su come renderlo una funzione.

1 Si potrebbe notare che questo sembra sfuggire la regola generale su non analizzando l'output da lso . ls produce un output molto leggibile; questo introduce idiosincrasie e limitazioni che lo rendono generalmente inadatto come input per altri comandi. In questo caso analizziamo ls poiché desideriamo preservare il comportamento esatto di ls tranne la nostra una modifica aggiunta.

2 Una limitazione di questo alias, che si applica anche alla versione della funzione mostrata sotto di essa, e che può essere considerata un bug, è che solo visualizza tre cifre ottali anche quando la quarta cifra ottale è zero. Poiché jfmercer ha giustamente sottolineato , le cifre ottali visualizzati qui non riflettono il bit appiccicoso se presente, né i bit setuid o setgid.

3 Più seriamente del semplice non mostrare la quarta cifra ottale è che questo metodo presuppone che non sono impostati, e < forte> se lo sono: se vedi ls , t o s nella stringa di autorizzazione, devi ignorare le cifre ottali . Questo perché i bit sono dedotti dalla stringa dei permessi in un modo che non tiene conto dei bit setuid / setgid appiccicosi.

    
risposta data Eliah Kagan 17.06.2012 - 10:12
17

Estendendo semplicemente \ semplificando le precedenti risposte relative a "stat":

Puoi semplicemente eseguire:

stat <path_to_file>

L'output conterrà il permesso ottale insieme ad altre informazioni.



Dettagli (versione stat ed esempio):

# stat --version
stat (GNU coreutils) 8.4

[[email protected] ~]# touch /tmp/TEST_PERMISSONS

[[email protected] ~]# chmod 644 /tmp/TEST_PERMISSONS

[[email protected] ~]# stat /tmp/TEST_PERMISSONS
  File: '/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Nota: ( 0644 / - rw-r - r -)

    
risposta data Vano 26.08.2015 - 18:07
6

Per la portabilità, puoi utilizzare perl :

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Se vuoi notare quando si verifica un errore, prova:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
    
risposta data cuonglm 21.09.2014 - 17:30
2

Puoi utilizzare find con l'azione -printf .

ls non mostra le autorizzazioni ottali, ma puoi utilizzare questa soluzione alternativa basata su find :

find path -printf "%m:%f\n"

Ad esempio, per controllare la mia directory di video:

$ find Videos -printf "%m:%f\n"
755:Videos

L'identificatore di formato %m dice all'azione -printf di stampare le autorizzazioni ottali, mentre l'identificatore di formato %f lo fa stampare il nome del file.

Puoi passare più nomi di file a find . Puoi persino utilizzare i glob (ad es.% Co_de%).

Non devi usare un test come find * -printf "%m:%f\n" o -name ; è sufficiente passare i nomi dei file o delle directory che ti interessano come punti di partenza a -iname . Cioè, fornisci i loro nomi come argomenti immediatamente dopo la parola find , come mostrato sopra.

find ti dà un grande controllo su come mostra l'output. Ci sono due modifiche in particolare che potresti trovare utili:

  • Per impostazione predefinita, find ricorre alle sottodirectory, in modo simile a find . Se non vuoi che ls -R visiti le sottodirectory dei punti di partenza che passi ad esso, puoi aggiungere find (o usare -maxdepth 0 con altri valori per indicare quanto vuoi che vada).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • -maxdepth mostra solo un nome file, quindi se %f deve recurse per arrivare a un file, potresti non sapere dove si trova. Per mostrare un percorso, iniziando con qualsiasi punto di partenza in cui è stato trovato il file, usa find .

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Vedi %p per ulteriori informazioni sull'utilizzo di man find comando.

Un altro metodo ( find e ls )

Può essere usato per elencare tutti i file di directory con le loro autorizzazioni:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Questo è essenzialmente lo stesso comando di awk alias di Adam Courtemanche , che la risposta citata, basta eseguire come un singolo comando. Se la usi solo una volta o in rare occasioni, non dovresti preoccuparti di scriverla come alias o funzione di shell.

    
risposta data Maythux 07.03.2014 - 08:16

Leggi altre domande sui tag