Wie kann ich in einem Shell-Skript einfach und nicht-invasiv den Schreibzugriff auf eine Datei testen, ohne tatsächlich zu versuchen, die Datei zu ändern?
Ich könnte die Ausgabe von analysieren stat
, aber das scheint wirklich komplex und vielleicht spröde zu sein, obwohl ich nicht sicher bin, wie viel stat-Ausgabe sich über Implementierungen und Zeit unterscheidet.
Ich könnte an das Ende der Datei anhängen und sehen, ob das gelingt, aber das ist möglicherweise gefährlich, und zwar aus zwei Gründen, die ich mir vorstellen kann:
- Ich muss jetzt den Zusatz entfernen, und falls ein anderer Prozess in die Datei schreibt, ist dies sofort nicht mehr trivial, da meine Zeile nicht mehr die letzte ist.
- Jeder Prozess, der die Datei liest, kann willkürliche Anforderungen an den Inhalt dieser Datei stellen, und ich habe diese Anwendung möglicherweise nur beschädigt.
quelle
man test
oderman [
type -a
test
wirdeuidaccess
das einfach überprüft, Berechtigungsbits . Gibt es keine anderen Faktoren (zB SELinux), die den Schreibzugriff verhindern könnten?&&
und||
haben die gleiche Priorität. Sie werden von links nach rechts ausgewertet.Ein anderer Ansatz:
Dadurch wird versucht, die Datei zum Anhängen zu öffnen. Wenn dies erfolgreich ist, führen Sie keinen Befehl aus (dh führen Sie einen Null-Befehl aus ), und geben Sie die Datei aus.
Beachten Sie, dass dadurch eine leere Datei erstellt wird, wenn sie nicht vorhanden ist.
Der
-w
Operator destest
Befehls könnte einfach astat
ausführen und dann versuchen, herauszufinden, ob Sie Zugriff haben sollten. Meine Alternative (oben) ist unter bestimmtentest
Umständen zuverlässiger als der Ansatz, da die Zugriffskontrolle eher vom Kernel als von der Shell durchgeführt werden muss. Beispielsweise,stat
wird, wird möglicherweise ein irreführender Moduswert zurückgegeben.quelle
touch
eine Datei zuzugreifen, deren Eigentümer ich war, auf die ich jedoch keinen Schreibzugriff hatte, und es war erfolgreich. Ich denke, es istchmod
die Datei undchmod
es ist zurück. Sotouch
scheint auf die Frage absolut nutzlos als eine Antwort zu sein.vim
hat das Verhalten, die Berechtigungen schnell zu ändern, wenn das Schreiben in schreibgeschützten Dateien erzwungen wird. Ich habe mitstrace
,touch
‚sopen
nicht mitEACCES
, aber die nachfolgenden Aufrufutimensat
erfolgreich ist , weshalb ich denke ,touch
über die ganze Exits erfolgreich.utimensat(2)
sagt : „ Berechtigungen Anforderungen: 1. Schreibzugriff (oder) , 2. die effektive Benutzer - ID des Anrufers muss der Besitzer der Datei übereinstimmen, ....“>> file
Ist nicht portabel (zB läuft das NULLCMD in zsh), benutzetrue >> file
stattdessen. Und wenn es sich bei der Datei um eine Named Pipes handelt, hat dies unangenehme Nebenwirkungen.G-man hat recht: sagt
[ -w ]
nicht immer die Wahrheit. Hier, um mit nicht existierenden Datei- und Berechtigungsverweigerungsnachrichten von der Shell umzugehen:Update : Sieht furchterregend aus, oder? Nun, es ist. Hmm ... wie man es ausdrückt ... BENUTZEN SIE DIESES NICHT, es sei denn, Sie wissen genau, dass Sie sich in den Bedingungen befinden, die es erfordert, um wie erwartet zu arbeiten. Siehe Stephanes Kommentar.
Was ist dann zu schließen? Auch wenn
[ -w ]
es nicht die Wahrheit sagt, ist es der einzige Befehl, der die Arbeit erledigen soll . Wenn nicht, werden wir es beschuldigen, Fehlerberichte schreiben und es wird in Zukunft funktionieren. Überprüfen Sie besser die Bedingungen, unter denen es funktioniert und verwendet wird[ -w ]
. Schreiben Sie speziellen Code für spezielle Fälle. Problemumgehungen haben ihre eigenen Bedingungen.ist das beste a priori .
quelle
test -w
In den meisten Implementierungenaccess(2)
sollte dies ausreichen, um Berechtigungen zu testen.