Ich möchte die Gruppenberechtigungen einer Datei anhand eines Bash-Skripts überprüfen. Insbesondere muss ich überprüfen, ob für eine Datei das beschreibbare Gruppenbit aktiviert ist.
Das ist es. So einfach ist das. Jedoch:
- Ich brauche das auch, um tragbar zu sein.
test -w <file
Ich werde nicht sagen, ob die Gruppe beschreibbar ist.- Die Ausgabe von
ls -ld
ist gut für Menschen, aber nicht so sicher über Skripte. Technisch könnte ich die Ausgabe analysierendrwxrwxr-x
, um die Gruppenbits zu extrahieren, aber das scheint spröde zu sein. - Die Schnittstelle für
stat
ist zwischen OS X und anderen Systemen vollständig inkompatibel. find <file> -perm ...
kann unmöglich die Antwort sein?
bash
permissions
ls
stat
mislav
quelle
quelle
Antworten:
Methode 1 - stat
Sie können den
stat
Befehl verwenden, um die Berechtigungsbits abzurufen.stat
ist auf den meisten Unixen verfügbar (OSX, BSD, nicht AIX von dem, was ich finden kann). Dies sollte auf den meisten Unixen funktionieren, außer auf OSX & BSD, soweit ich das finde.Beispiel
Verwenden Sie diesen Befehl:
Verwenden Sie eine einfache Methode,
grep
um festzustellen, ob der Gruppenberechtigungsmodus 6 oder 7 ist.Für OS X und BSD müßten Sie diese Form verwenden
stat
,stat -f
(oder vielleichtstat -x
), und entsprechend zu analysieren. Da die Optionenstat
unterschiedlich sind, können Sie diesen Befehl in einenlsb_release -a
Befehl einschließen und die entsprechende Version basierend auf dem Betriebssystem aufrufen. Nicht ideal, aber praktikabel. Erkenne , dasslsb_release
ist für Linux - Distributionen nur so eine weitere Alternative müssten für die Prüfung anderer Unix - Betriebssysteme entwickelt werden.Methode 2 - finden
Ich denke, dieser Befehl könnte Ihnen jedoch besser dienen. Ich benutze
find
und denprintf
Schalter.Beispiel
Methode 3 - Perl
Perl ist möglicherweise eine portablere Methode, um dies zu tun, abhängig von den Betriebssystemen, die Sie abdecken möchten.
HINWEIS: Im obigen Abschnitt wird die Perl-
stat()
Funktion zum Abfragen der Dateisystembits verwendet.Sie können dies kompakter gestalten, indem Sie auf die Verwendung eines Arrays verzichten
@pv
und die Ausgabe vonstat()
direkt bearbeiten:quelle
stat
Befehl variiert stark zwischen verschiedenen Systemen und ist nicht portabel.find . -printf
kann es, kann aber nicht feststellen, ob es auf OSX 'find verfügbar ist.Eine Option ist die Verwendung
perl
, die überall tragbar seinperl
wird. Es ist schwierig, ein Unix-System ohne es zu finden. Hier ist ein Beispiel, wie es in ein Shell-Skript integriert werden kann:Ähnliche
perl
Beispiele finden Sie im stat perldoc .quelle
ls
Am Ende habe ich analysiert:Ich bin dankbar für die ausführliche Antwort von @ slm, aber keine der anderen Methoden ist so einfach. Die
stat
Methode würde erfordern, dass ich mindestens zwei verschiedene Aufrufe schreibe, um OS X abzudecken, und selbst danach gibt sie die oktale Darstellung zurück, auf die ich noch arithmetisch anwenden muss. Die Perl-Methode ist in Ordnung, erfordert jedoch, dass ich einen Interpreter für eine so einfache Aufgabe starte, und ich möchte sie einfach halten und nur Posix-Utils verwenden.quelle
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Alle Standard-Unix / Linux-Tools.
Ich nehme an, es ist MÖGLICH, Gruppen schreiben zu lassen, aber nicht Gruppen lesen. In dieser Möglichkeit wäre es entweder eine case-Anweisung 2 | 3 | 6 | 7) oder ein grep '[2 | 3 | 6 | 7]'
quelle