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


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


316
2018-06-17 08:04


origine




risposte:


Puoi provare

stat -c "%a %n" *

Sostituire * con la directory pertinente o il nome esatto del file che si desidera esaminare.

Dal 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)


450
2018-06-17 08:08



su mac os, usa stat -f '%A %a %N' * (credito: geeklog.adamwilson.info/article/58/...) - s2t2
Se ti senti più a tuo agio ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends che cicla sull'output di ls è una cattiva idea Se vuoi davvero usare un ciclo puoi farlo for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Perché su Mac OS tutto è leggermente cambiato (anche in Unix iso utils)? C'è una vera ragione per questo? - Vassilis
Per favore @hackel, dicci come ti senti davvero. lol! - MikeSchinkel


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

Basta premere Ctrl+alt+T sulla tastiera per aprire Terminal. Quando si apre, navigare nella directory in cui si desidera trovare i permessi dei file in modalità ottale.

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

% A Diritti di accesso in forma leggibile

% a Diritti di accesso in ottale

% n Nome del file

Numeri ottali e permessi

Puoi usare 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 ed esegui   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

Il permesso effettivo è 761.

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


37
2018-06-17 08:14



Anche lo 0 iniziale rappresenta un bit speciale: pastebin.com/6ymkFt71 - Braiam


Come dettagliato in Autorizzazioni "stile 755" con "ls" di Adam Courtemanche sopra AgileAdam.com, puoi creare un alias  lso che agisce come ls -l ma elabora leggermente l'output1 per visualizzare le autorizzazioni anche in ottale. Questo aggiunge una colonna principale che mostra tre cifre2 permessi ottali. 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, però, come techtonik  sottolinea. tu non può passare argomenti a questa lso alias come vorresti il ls comando, perché sono considerati come argomenti addizionali a awk anziché. Quindi non puoi correre lso su uno specifico file o directory, né puoi passare alcuna opzione (come -F, o --color) a lso.


La correzione è da definire lso  come un 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 stai provando questo in modo interattivo nella tua shell, corri unalias lso per rimuovere l'alias: puoi farlo prima o dopo aver definito la funzione. Se lo stai inserendo in un file di provenienza, ad esempio ~/.bashrc, tira fuori il alias linea e aggiungere la definizione della funzione.

Perché funziona? A differenza degli alias, le funzioni di shell bash possono assumere parametri posizionali, cioè argomenti della riga di comando. "$@" si espande alla lista completa degli argomenti, causando argomenti al lso funzione da passare a ls. (A differenza di una definizione di alias, un corpo di funzione non è quotato, quindi è stato necessario rimuovere il \personaggi prima $ e ".)

Dal momento che puoi passare le opzioni a lso quando definito in questo modo come una funzione, potresti voler rimuovere il -a e -G opzioni dalla definizione - puoi passarle manualmente nei casi in cui le vuoi. (Il -l l'opzione è richiesta per i dettagli come i permessi dei file da mostrare affatto, quindi non c'è alcun vantaggio 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 sottolineando la limitazione nel definire lso come alias, motivandomi così ad espandere questo post con materiale su come renderlo una funzione invece.


1Si può notare che questo sembra non essere d'accordo la regola generale per non analizzare l'output da ls. ls produce un output molto leggibile dall'uomo; questo introduce idiosincrasie e limitazioni che lo rendono generalmente inadatto come input per altri comandi. In questo caso noi analizziamo ls da desideriamo preservare il comportamento esatto di ls tranne il nostro uno aggiunto cambiamento.

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

3Più seriamente del semplice non mostrare la quarta cifra ottale è che questo metodo assume non sono impostati, e se lo sono - se vedi t, s, o S nella stringa di autorizzazione - quindi è necessario 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.


33
2018-06-17 08:12



non funziona con le directory - awk: read error (Is a directory) - anatoly techtonik
@techtonik Grazie per aver segnalato questo! Ho (finalmente) aggiornato questa risposta per includere una correzione per questo. - Eliah Kagan
Puoi aggiungere --color parametro per mostrare i colori lso() { 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


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


[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

Notare la: (0644/ -rw-r - r--)


17
2017-08-26 16:07





Per la portabilità, puoi usare 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

6
2017-09-21 15:30



Oltre a essere portatile, la soluzione di @ cuonglm mostra quattro caratteri ottali piuttosto che tre, mostrando così lo stato del "pezzo appiccicoso" che spesso viene dimenticato. - jfmercer


Puoi usare find con il -printf azione.

ls non mostra permessi ottali, ma puoi usare questo findsoluzione alternativa:

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

Ad esempio, per controllare la mia directory di video:

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

Il %m lo specificatore di formato dice al -printf azione per stampare permessi ottali, mentre il %f l'identificatore di formato lo fa stampare il nome del file.

È possibile passare più nomi di file a find. Puoi anche usare i glob (ad es. find * -printf "%m:%f\n").

Non devi usare un test come -name o -iname; è sufficiente passare i nomi dei file o delle directory che ti interessano come punti di partenza find. Cioè, fornire 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:

  • Di default, find ricorre sottodirectory, simile a ls -R. Se non vuoi find per visitare le sottodirectory dei punti di partenza che passi ad esso, puoi aggiungere -maxdepth 0 (o usare -maxdepth con altri valori per indicare quanto in profondità vuoi che vada).

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

    $ 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 find per ulteriori informazioni sull'utilizzo di find comando.

Un altro metodo (ls e 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 di Di Adam Courtemanche lso alias, quale quella risposta citato, basta eseguire come un singolo comando. Se si sta utilizzando solo per questa volta, o in rare occasioni, allora si potrebbe non voler disturbare la scrittura come una funzione di alias o shell.


2
2018-03-07 07:16