Wie erhalte ich oktale Dateiberechtigungen über die Befehlszeile?


373

Es gibt einen chmod- Befehl zum Festlegen von Dateiberechtigungen. Kann ich Dateiberechtigungen im oktalen Modus (z. B. 755) über die Befehlszeile abrufen?


2
Für Leute wie mich, die versehentlich auf dieser Seite gelandet sind, aber tatsächlich gesucht haben, wie das auf einem Mac geht: stackoverflow.com/a/14855227/470749
Ryan,

2
stat --format "%A" $FILEgibt Ihnen das für Menschen lesbare drwxr-x---Format. was nützlich sein kann oder nicht.
Trevor Boyd Smith

Antworten:


535

Du kannst es versuchen

stat -c "%a %n" *

Ersetzen Sie *durch das entsprechende Verzeichnis oder den genauen Dateinamen, den Sie untersuchen möchten.

Von der Manpage von 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

Verwendungszweck:

  • Mit Dateien:

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

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

(Referenz)


57
Verwenden Sie unter Mac OSstat -f '%A %a %N' *
Bildnachweis

1
Wenn Sie sich wohler fühlen mit ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
@ usandfriends auf die Ausgabe von Looping lsist eine schlechte Idee. Wenn Sie wirklich eine Schleife verwenden möchten, können Sie dies tunfor f in *; do stat "%a %n" "$f"; done
Tom Fenech

1
Warum ist auf Mac OS alles leicht verändert (auch in Unix-ISO-Utils)? Gibt es einen tatsächlichen Grund dafür?
Vassilis

2
Bitte @hackel, sag uns, wie du dich wirklich fühlst. lol!
MikeSchinkel

44

Dateiberechtigungen unter Linux können mit dem Befehl Linux stat im oktalen Format angezeigt werden.

Drücken Sie einfach Ctrl+ Alt+ Tauf Ihrer Tastatur, um das Terminal zu öffnen. Navigieren Sie beim Öffnen zu dem Verzeichnis, in dem Sie die Dateiberechtigungen im Oktalmodus suchen möchten.

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

% A Zugriffsrechte in lesbarer Form

% a Zugriffsrechte in Oktal

% n Dateiname

Oktalzahlen und Berechtigungen

Sie können die Oktalzahl verwenden, um den Modus / die Berechtigung darzustellen:

r: 4
w: 2
x: 1

Für den Dateibesitzer können Sie beispielsweise den Oktalmodus wie folgt verwenden. Die (vollständige) Berechtigung zum Lesen, Schreiben und Ausführen einer Datei im Oktal ist 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Nur die Lese- und Schreibberechtigung für eine Datei in Oktal ist 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Nur Lese- und Ausführungsberechtigungen für eine Datei in Oktal sind 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Verwenden Sie die obige Methode, um die Berechtigung für Gruppen und andere zu berechnen. Angenommen, Sie möchten dem Eigentümer die vollständige Berechtigung erteilen, die Berechtigung zum Lesen und Ausführen von Gruppen erteilen und anderen nur die Berechtigung zum Lesen erteilen. Dann müssen Sie die Berechtigung wie folgt berechnen: Benutzer = r + w + x = 0 + 4 + 2 + 1 = 7 Gruppe = r + w + x = 0 + 4 + 2 + 0 = 6 Andere = r + w + x = 0 + 0 + 1 = 1

Wirksame Erlaubnis ist 761.

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


2
Die anfänglichen 0 repräsentieren speziell wenig zu: pastebin.com/6ymkFt71
Braiam

36

Wie detailliert in „755“ -Stil Erlaubnissen ‚ls‘ von Adam Courtemanche auf AgileAdam.com , können Sie erstellen eine Alias lso , der wie wirkt ls -laber verarbeitet leicht den Ausgang 1 zu Anzeigeberechtigungen auch in Oktal. Dies fügt eine führende Spalte mit dreistelligen 2- Oktal-Berechtigungen hinzu. Wie geschrieben funktioniert dies für die meisten Dateien und Verzeichnisse, aber es funktioniert nicht richtig, wenn die Sticky- oder Setuid / Setgid- Bits gesetzt sind. 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}'"

Dies hat einen ernsten Mangel, obwohl, wie Techtonik weist darauf hin . Sie können diesem lsoAlias keine Argumente wie dem lsBefehl übergeben , da sie awkstattdessen als zusätzliche Argumente verwendet werden. Sie können daher weder lsoeine bestimmte Datei oder ein bestimmtes Verzeichnis ausführen , noch Optionen (wie -Foder --color) übergeben lso.


Der Fix besteht darin, lso eine Funktion anstatt eines Alias zu definieren .

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}'; }

Wenn Sie dies interaktiv in Ihrer Shell ausprobieren, führen Sie den Befehl aus, unalias lsoum den Alias ​​zu entfernen. Dies können Sie entweder vor oder nach der Definition der Funktion tun. Wenn Sie es in eine Datei einfügen, deren Quelle beispielsweise ist ~/.bashrc, nehmen Sie einfach die aliasZeile heraus und fügen Sie die Funktionsdefinition hinzu.

Warum funktioniert das? Im Gegensatz zu Aliasen können Bash-Shell-Funktionen Positionsparameter , dh Befehlszeilenargumente, annehmen . "$@"Erweitert die vollständige Argumentliste , wodurch Argumente an die lsoFunktion übergeben werden ls. (Im Gegensatz zu einer Alias-Definition wird ein Funktionskörper nicht in Anführungszeichen gesetzt. Daher mussten die \Zeichen vor $und entfernt werden ".)

Da Sie Optionen übergeben können, lsowenn Sie auf diese Weise als Funktion definiert wurden, möchten Sie möglicherweise die -aund -G-Optionen aus der Definition entfernen. Sie können sie in Fällen, in denen Sie sie möchten, manuell übergeben. ( Die -lOption ist für Details wie Dateiberechtigungen erforderlich angezeigt wird überhaupt , so gibt es keinen Vorteil , es zu entfernen.)

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}'; }

Dank Techtonik für den Hinweis auf die Einschränkung bei der Definition lsoals Alias, also ich motivierend diesen Beitrag mit Material erweitern darüber eine Funktion stattdessen zu machen.


1 Man kann feststellen, dass dies gegen die allgemeine Regells zu verstoßen scheint, dass die Ausgabe von nicht analysiert wird . lsErzeugt eine sehr gut lesbare Ausgabe. Dies führt zu Besonderheiten und Einschränkungen, die es im Allgemeinen als Eingabe für andere Befehle ungeeignet machen. In diesem Fall analysieren wir, lsda wir das exakte Verhalten vonls bis auf unsere einzige hinzugefügte Änderung beibehalten möchten .

2 Eine Einschränkung dieses Alias, die auch für die darunter gezeigte Funktionsversion gilt und als Fehler angesehen werden kann, besteht darin, dass nur drei Oktalziffern angezeigt werden, auch wenn die vierte Oktalziffer Null ist. Wie jfmercer hat zu Recht darauf hingewiesen , zeigten die Oktalziffern hier spiegeln nicht das Sticky - Bit , falls vorhanden, noch setuid oder setgid - Bits.

3 Noch gravierender ist als nicht nur den vierten Oktalziffer zeigt ist , dass diese Methode übernimmt sie nicht festgelegt ist, und wenn sie - wenn Sie sehen t, soder Sin der Berechtigungszeichenfolge - dann sollten Sie die Oktalziffern außer Acht lassen . Dies liegt daran, dass die Bits in einer Weise aus der Berechtigungszeichenfolge abgeleitet werden, die klebrige setuid / setgid-Bits nicht berücksichtigt.


funktioniert nicht mit Verzeichnissen -awk: read error (Is a directory)
anatoly techtonik

@techtonik Danke für den Hinweis! Ich habe diese Antwort (endlich) aktualisiert, um eine Lösung dafür zu finden.
Eliah Kagan,

1
Sie können --colorParameter für 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}'; }
Showfarben

1
Haben Sie seit dem Posten eine Lösung für das klebrige Problem mit setuid / setgid gefunden?
Silvestris

21

Nur die vorherigen stat-bezogenen Antworten erweitern und vereinfachen:

Sie können einfach ausführen:

stat <path_to_file>

Die Ausgabe enthält neben anderen Informationen auch die oktale Berechtigung.



Details (stat version und Beispiel):

# 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

Beachten Sie die: ( 0644 / -rw-r - r--)


6

Aus Gründen der Portabilität können Sie Folgendes verwenden 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

Wenn Sie feststellen möchten, dass ein Fehler auftritt, versuchen Sie Folgendes:

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

2
Die Lösung von @ cuonglm ist nicht nur portabel, sondern zeigt auch vier statt drei Oktalzeichen und damit den Zustand des "Sticky Bits" an, der oft vergessen wird.
Jfmercer

2

Sie können findmit der -printfAktion verwenden.

lsZeigt keine oktalen Berechtigungen an, aber Sie können diese findProblemumgehung verwenden:

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

So überprüfen Sie beispielsweise mein Videoverzeichnis:

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

Der %mFormatbezeichner weist die -printfAktion an, oktale Berechtigungen zu drucken, während der %fFormatbezeichner den Dateinamen ausgibt.

Sie können mehrere Dateinamen an übergeben find. Sie können sogar Globs verwenden (zB find * -printf "%m:%f\n").

Sie müssen keinen Test wie -nameoder verwenden -iname. Es reicht aus, die Namen der Dateien oder Verzeichnisse, an denen Sie interessiert sind, als Ausgangspunkte zu übergeben find. Das heißt, geben Sie ihre Namen als Argumente direkt nach dem Wort an find, wie oben gezeigt.

findgibt Ihnen eine gute Kontrolle darüber, wie die Ausgabe angezeigt wird. Es gibt insbesondere zwei Modifikationen, die Sie nützlich finden könnten:

  • Standardmäßig findrekursive Unterverzeichnisse, ähnlich wie ls -R. Wenn Sie finddie Unterverzeichnisse der Startpunkte, die Sie übergeben, nicht besuchen möchten , können Sie sie hinzufügen -maxdepth 0(oder zusammen -maxdepthmit anderen Werten angeben, wie tief sie sein sollen).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fZeigt nur einen Dateinamen findan. Wenn Sie also erneut auf eine Datei zugreifen müssen, wissen Sie möglicherweise nicht, wo sie sich befindet. Verwenden Sie %pstattdessen, um einen Pfad anzuzeigen, beginnend mit dem Startpunkt, unter dem die Datei gefunden wurde .

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

Sehen Sie man findfür weitere Informationen über die Verwendung von findBefehl.

Eine andere Methode ( lsund awk)

Dies kann verwendet werden, um alle Verzeichnisdateien mit ihren Berechtigungen aufzulisten:

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}'

Dies ist im Wesentlichen derselbe Befehl wie in Adam Courtemanches lsoAlias , der in dieser Antwort nur als ein einziger Befehl ausgeführt wird. Wenn Sie diese Funktion nur einmal oder in seltenen Fällen verwenden, möchten Sie sie möglicherweise nicht als Alias- oder Shell-Funktion schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.