Come posso ottenere le autorizzazioni per i file ottali dalla riga di comando?


373

Esiste un comando chmod per impostare le autorizzazioni per i file, ma posso ottenere le autorizzazioni per i file in modalità ottale (come 755) dalla riga di comando?


2
Per le persone come me che sono arrivate accidentalmente su questa pagina ma in realtà stavano cercando come farlo su Mac: stackoverflow.com/a/14855227/470749
Ryan

2
stat --format "%A" $FILEti dà il drwxr-x---formato leggibile dall'uomo . che può essere utile o meno.
Trevor Boyd Smith,

Risposte:


535

Puoi provare

stat -c "%a %n" *

Sostituisci *con la directory pertinente o con il nome file esatto che desideri 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

Uso:

  • Con i file:

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

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

(Riferimento)


57
su mac os, utilizzare stat -f '%A %a %N' *(credito: geeklog.adamwilson.info/article/58/… )
s2t2

1
Se ti senti più a tuo agio con ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
@usandfriends in loop sull'output di lsè una cattiva idea. Se vuoi davvero usare un loop puoi farlofor f in *; do stat "%a %n" "$f"; done
Tom Fenech,

1
Perché su mac os tutto è leggermente cambiato (anche in unix iso utils)? C'è un vero motivo per questo?
Vassilis,

2
Per favore @hackel, dicci come ti senti davvero. lol!
MikeSchinkel,

44

Le autorizzazioni per i file in Linux possono essere visualizzate in formato ottale usando il comando stat di Linux.

Premi Ctrl+ Alt+ Tsulla tastiera per aprire Terminale. Quando si apre, vai alla directory in cui desideri 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 e autorizzazioni ottali

È possibile utilizzare il numero ottale per rappresentare la modalità / autorizzazione:

r: 4
w: 2
x: 1

Ad esempio, per il proprietario del file è possibile utilizzare la modalità ottale come segue. L'autorizzazione di lettura, scrittura ed esecuzione (completa) su un file in ottale è 0 + r + w + x = 0 + 4 + 2 + 1 = 7

L'autorizzazione di sola lettura e scrittura su un file in ottale è 0 + r + w + x = 0 + 4 + 2 + 0 = 6

L'autorizzazione solo per leggere ed eseguire un file in ottale è 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Utilizzare il metodo sopra per calcolare l'autorizzazione per il gruppo e altri. Diciamo che desideri dare l'autorizzazione completa al proprietario, leggere ed eseguire l'autorizzazione per raggruppare e leggere solo l'autorizzazione per gli altri, quindi devi calcolare l'autorizzazione come segue: Utente = r + w + x = 0 + 4 + 2 + 1 = 7 Gruppo = r + w + x = 0 + 4 + 2 + 0 = 6 Altri = r + w + x = 0 + 0 + 0 + 1 = 1

L'autorizzazione effettiva è 761.

Fonte: http://kmaiti.blogspot.com/2011/09/umask-concept.html


2
Lo 0 iniziale rappresenta anche un bit speciale: pastebin.com/6ymkFt71
Braiam,

36

Come dettagliato nelle autorizzazioni in stile "755" con "ls" di Adam Courtemanche su AgileAdam.com , è possibile creare un alias lso che agisce come ls -lma elabora leggermente l'output 1 per visualizzare le autorizzazioni anche in ottale. Ciò aggiunge una colonna iniziale che mostra le autorizzazioni ottali a 2 cifre a tre cifre . Come scritto, questo funziona per la maggior parte dei file e delle directory, ma non funziona correttamente se sono impostati i bit sticky o setuid / setgid . 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}'"

Ciò ha una grave lacuna, tuttavia, come sottolinea Techtonik . È Non è possibile passare argomenti a questo alias come si farebbe per il comando , perché sono presi come argomenti aggiuntivi a posto. Pertanto non è possibile eseguire su un file o una directory specifici, né è possibile passare alcuna opzione (come , o ) a .lsolsawklso-F--colorlso


La correzione è definire lso come una funzione piuttosto che un 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}'; }

Se lo stai provando in modo interattivo nella tua shell, corri unalias lsoper rimuovere l'alias: puoi farlo prima o dopo aver definito la funzione. Se lo stai inserendo in un file di provenienza, ad esempio ~/.bashrc, elimina la aliasriga e aggiungi la definizione della funzione.

Perché funziona? A differenza degli alias, le funzioni della shell bash possono assumere parametri posizionali , cioè argomenti della riga di comando . "$@"si espande all'elenco completo degli argomenti , causando il passaggio degli argomenti alla lsofunzione ls. (A differenza di una definizione di alias, un corpo di funzione non è citato; quindi è stato necessario rimuovere i \caratteri prima $e ".)

Dal momento che puoi passare le opzioni a lsoquando definite in questo modo come una funzione, potresti voler rimuovere le opzioni -ae -Gdalla definizione - puoi passarle manualmente nei casi in cui le desideri. ( L' -lopzione è necessaria per dettagli come i permessi dei file per essere mostrato a tutti , quindi non c'è beneficio per rimuoverlo.)

lso() { ls -l "$@" | 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}'; }

Grazie a techtonik per aver sottolineato la limitazione nella definizione lsodi alias, motivandomi così ad espandere questo post con materiale per renderlo invece una funzione.


1 Si può notare che questo sembra infrangere la regola generale di non analizzare l'output dals . lsproduce output molto leggibili dall'uomo; questo introduce idiosincrasie e limitazioni che lo rendono generalmente inadatto come input per altri comandi. In questo caso analizziamo lspoiché desideriamo preservare il comportamento esattols tranne il nostro unico cambiamento aggiunto.

2 Una limitazione di questo alias, che si applica anche alla versione della funzione mostrata di seguito, e che può essere considerata un bug, è che visualizza solo tre cifre ottali anche quando la quarta cifra ottale è zero. Come jfmercer ha giustamente osservato , le cifre ottali qui visualizzati non riflettono lo sticky bit se bit presenti, nè setuid o setgid.

3 Più seriamente che semplicemente non mostra la quarta cifra ottale è che questo metodo presuppone che non sono impostati, e se sono - se si vede t, so Snella stringa di permesso - allora si dovrebbe ignorare le cifre ottali . Questo perché i bit vengono dedotti dalla stringa dei permessi in un modo che non tiene conto dei bit appiccicosi setuid / setgid.


non funziona con le directory -awk: read error (Is a directory)
anatoly techtonik,

@techtonik Grazie per averlo segnalato! Ho (finalmente) aggiornato questa risposta per includervi una correzione.
Eliah Kagan,

1
Puoi aggiungere un --colorparametro per mostrare i colorilso() { ls -alG "$@" --color | 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}'; }
tagplus5

1
hai scoperto una soluzione al problema del setuid / setgid appiccicoso da quando lo hai pubblicato?
Silvestris

21

Basta estendere \ semplificare le precedenti risposte relative a "stat":

Puoi semplicemente eseguire:

stat <path_to_file>

L'output conterrà l'autorizzazione ottale insieme ad altre informazioni.



Dettagli (versione stat ed esempio):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# 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--)


6

Per la portabilità, è possibile 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 si desidera notare quando si verifica un errore, provare:

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

2
Oltre ad essere portatile, la soluzione di @ cuonglm mostra quattro caratteri ottali anziché tre , mostrando così lo stato del "pezzettino" che viene spesso dimenticato.
jfmercer,

2

È possibile utilizzare findcon l' -printfazione.

lsnon mostra autorizzazioni ottali, ma è possibile utilizzare questa findsoluzione alternativa basata su:

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

Ad esempio, per controllare la mia directory Video:

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

L' %midentificatore di formato dice -printfall'azione di stampare le autorizzazioni ottali, mentre l' %fidentificatore di formato fa sì che stampa il nome file.

Puoi passare più nomi di file a find. Puoi persino usare globs (ad es find * -printf "%m:%f\n".).

Non è necessario utilizzare un test come -nameo -iname; è sufficiente passare i nomi dei file o delle directory a cui si è interessati come punti di partenza find. Cioè, fornire i loro nomi come argomenti immediatamente dopo la parola find, come mostrato sopra.

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

  • Per impostazione predefinita, findricorre alle sottodirectory simili a ls -R. Se non vuoi findvisitare le sottodirectory dei punti di partenza che le passi, puoi aggiungere -maxdepth 0(o usare -maxdepthcon altri valori per indicare quanto in profondità vuoi che vada).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fmostra solo un nome file, quindi se findè necessario ricorrere per accedere a un file, potresti non sapere dove si trova. Per mostrare un percorso, a partire dal punto di partenza in cui è stato trovato il file, utilizzare %pinvece.

    $ 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
    ....

Vedere man findper ulteriori informazioni sull'uso del findcomando.

Un altro metodo ( lse awk)

Questo 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($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Questo è essenzialmente lo stesso comando come in Adam Courtemanche lsoalias , che tale soluzione citata, basta eseguire come un singolo comando. Se lo usi solo una volta o in rare occasioni, potresti non preoccuparti di scriverlo come alias o funzione shell.

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.