Wie kann in Python am besten festgestellt werden, ob ein Verzeichnis für den Benutzer, der das Skript ausführt, beschreibbar ist? Da dies wahrscheinlich die Verwendung des OS-Moduls beinhaltet, sollte ich erwähnen, dass ich es unter einer * nix-Umgebung ausführe.
python
file
permissions
directory
operating-system
beleuchteter Tiger
quelle
quelle
os.access()
ist die Überprüfung anhand der tatsächlichen UID und GID, nicht anhand der effektiven . Dies kann in SUID / SGID-Umgebungen zu Verrücktheiten führen. ('aber das Skript läuft setuid root, warum kann es nicht in die Datei schreiben?')os.access(dirpath, os.W_OK | os.X_OK)
Gibt True zurück, auch wenn ich keinen Schreibzugriff habe.Es mag seltsam erscheinen, dies vorzuschlagen, aber eine verbreitete Python-Sprache ist
Nach dieser Redewendung könnte man sagen:
Versuchen Sie, in das betreffende Verzeichnis zu schreiben, und fangen Sie den Fehler ab, wenn Sie nicht die Berechtigung dazu haben.
quelle
except: pass
- auf diese Weise können Sie immer optimistisch sein und hoch von sich selbst denken. / Sarkasmus aus. Warum sollte ich nun beispielsweise versuchen, etwas in jedes Verzeichnis in meinem Dateisystem zu schreiben, um eine Liste der beschreibbaren Speicherorte zu erstellen?Meine Lösung mit dem
tempfile
Modul:Update: Nach dem erneuten Testen des Codes unter Windows stelle ich fest, dass bei der Verwendung von tempfile tatsächlich ein Problem vorliegt. Siehe Problem 22107: Das tempfile-Modul interpretiert den Fehler "Zugriff verweigert" unter Windows falsch . Bei einem nicht beschreibbaren Verzeichnis bleibt der Code einige Sekunden lang hängen und löst schließlich ein aus
IOError: [Errno 17] No usable temporary file name found
. Vielleicht hat user2171842 dies beobachtet? Leider ist das Problem vorerst nicht behoben. Um dies zu beheben, muss auch der Fehler abgefangen werden:Die Verzögerung ist dann natürlich in diesen Fällen noch vorhanden.
quelle
tempfile
. Es funktioniert nur, wenn es keineOSError
Bedeutung hat, dass es die Berechtigung zum Schreiben / Löschen hat. Andernfalls wird diesreturn False
nicht der Fall sein, da kein Fehler zurückgegeben wird und das Skript nicht weiter ausgeführt oder beendet wird. nichts wird zurückgegeben. es steckt nur in dieser Zeile. Das Erstellen einer nicht temporären Datei wie der Antwort von khattam funktioniert jedoch sowohl, wenn die Berechtigung zulässig ist oder verweigert wird. Hilfe?Stolperte über diesen Thread und suchte nach Beispielen für jemanden. Erstes Ergebnis bei Google, herzlichen Glückwunsch!
In diesem Thread wird über die pythonische Vorgehensweise gesprochen, aber keine einfachen Codebeispiele? Auf geht's für alle anderen, die stolpern:
Dies versucht, ein Dateihandle zum Schreiben zu öffnen, und wird mit einem Fehler beendet, wenn die angegebene Datei nicht beschrieben werden kann: Dies ist viel einfacher zu lesen und eine viel bessere Methode, als Vorprüfungen des Dateipfads oder des Verzeichnisses durchzuführen , da es Rennbedingungen vermeidet; Fälle, in denen die Datei zwischen dem Ausführen der Vorprüfung und dem tatsächlichen Versuch, in die Datei zu schreiben, nicht mehr beschreibbar ist.
quelle
Wenn Sie sich nur für die Dauerwellen interessieren,
os.access(path, os.W_OK)
sollten Sie das tun, wonach Sie fragen. Wenn Sie stattdessen wissen möchten, ob Sie in das Verzeichnis schreiben können ,open()
eine Testdatei zum Schreiben (sie sollte vorher nicht vorhanden sein), eine abfangen und untersuchenIOError
und anschließend die Testdatei bereinigen.Um TOCTOU- Angriffe zu vermeiden (nur ein Problem, wenn Ihr Skript mit erhöhten Berechtigungen ausgeführt wird - suid oder cgi oder so), sollten Sie diesen vorzeitigen Tests nicht wirklich vertrauen, sondern Privilegien löschen, das tun
open()
und erwarten dieIOError
.quelle
Überprüfen Sie die Modusbits:
quelle
Folgendes habe ich basierend auf der Antwort von ChristopheD erstellt:
quelle
Weitere Informationen zum Zugang finden Sie hier
quelle
Ich bin auf dasselbe Bedürfnis gestoßen, als ich über argparse ein Argument hinzugefügt habe. Das eingebaute
type=FileType('w')
würde für mich nicht funktionieren, da ich nach einem Verzeichnis suchte. Am Ende schrieb ich meine eigene Methode, um mein Problem zu lösen. Hier ist das Ergebnis mit Argparse-Snippet.Das ergibt folgendes:
Ich ging zurück und fügte am Ende print opts.dir hinzu , und alles scheint wie gewünscht zu funktionieren.
quelle
Wenn Sie die Berechtigung eines anderen Benutzers überprüfen müssen (ja, mir ist klar, dass dies der Frage widerspricht, aber für jemanden nützlich sein kann), können Sie dies über das
pwd
Modul und die Modusbits des Verzeichnisses tun .Haftungsausschluss - funktioniert nicht unter Windows, da das POSIX-Berechtigungsmodell nicht verwendet wird (und das
pwd
Modul dort nicht verfügbar ist), z. B. - Lösung nur für * nix-Systeme.Beachten Sie, dass in einem Verzeichnis alle 3 Bits gesetzt sein müssen - Lesen, Schreiben und eXecute.
Ok, R ist kein absolutes Muss, aber ohne es können Sie die Einträge im Verzeichnis nicht auflisten (also müssen Sie ihre Namen kennen). Die Ausführung ist andererseits unbedingt erforderlich - ohne dass der Benutzer die Inodes der Datei nicht lesen kann; Selbst mit W können ohne X-Dateien keine Dateien erstellt oder geändert werden. Detaillierte Erklärung unter diesem Link.
Schließlich sind die Modi im
stat
Modul verfügbar , ihre Beschreibungen sind in inode (7) man .Beispielcode zur Überprüfung:
quelle