Gibt es eigentlich eine einfache Möglichkeit zu ermitteln, ob man die richtigen Rechte besitzt um Dateioperation XY machen zu können?
Oder müßte ich das zu Fuss per os.stat() herrausfinden?
Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Hoi Jens,
Hilft Dir os.access weiter? Oder möchtest Du doch was Anderes erfahren?
Gruß,
Christian
Hilft Dir os.access weiter? Oder möchtest Du doch was Anderes erfahren?
Gruß,
Christian
Ich nicht. Wenn niemand eine Alternative weiß: Selber rechnen oder os.access mehrmals aufrufen, um die vollständige Info zu erhalten.
Gruß,
Christian
Gruß,
Christian
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Was ist die "Symbolische Notation"?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Z. B. -rwxr-xr-x für 755.
edit: zu langsam
edit: zu langsam
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Halbgare rekursive Lösung (die nicht mit Sticky-Bit etc- funktioniert):
Wenn man die einzelnen Stellen etwa 7 in 1, 2, und 4 zerlegen könnte, wäre das alles einfacher und schöner zu implementieren.
Code: Alles auswählen
def o2s_recurse(octal):
values = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx']
last_bit = octal % 8
symbolic = []
if octal / 8 != 0:
symbolic.extend(o2s_recurse(octal / 8))
symbolic.append(values[last_bit])
return symbolic
def o2s(octal):
value = ''.join(o2s_recurse(octal))
fill = 9 - len(value)
return fill * '-' + value
print o2s(0764)
print o2s(0000)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Die einfache Methode: http://paste.pocoo.org/show/27137/
Jap, hab ich auch schon dran rumgeknobelt.Leonidas hat geschrieben: Wenn man die einzelnen Stellen etwa 7 in 1, 2, und 4 zerlegen könnte, wäre das alles einfacher und schöner zu implementieren.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Code: Alles auswählen
print ''.join(d if c=='1' else '-' for (c,d) in zip(bin(octal), 'rwxrwxrwx'))
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das sieht gut aus, aber warum kein dict nutzten? Werde ich morgen mal umschreiben...rafael hat geschrieben:Die einfache Methode: http://paste.pocoo.org/show/27137/
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Und noch dazu iterativ? Das geht ja mal gar nichtjens hat geschrieben:Das sieht gut aus, aber warum kein dict nutzten?rafael hat geschrieben:Die einfache Methode: http://paste.pocoo.org/show/27137/
rafael, willst du uns mit der Reihenfolge 4, 2, 6, 1, 5, 3, 7 irgendwas mitteilen
Außerdem fehlen uns ja noch so Juwelen wie Set UID, Set GUID und Sticky-Bit (jeweils +4, +2 und +1 dazurechnen). Die Regeln dafür sind Klasse: aus rwx wird mit +s ein rws, aus rw- wird rwS und das gleiche gibts mit dem Sticky-Bit noch mal mit dem Buchstaben T.
Edit: birkenfeld, cool. Das ist mal was nicht-langweiliges
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also ganz so einfach scheint das ja nicht zu sein
Ich hab Rafaels Vearinate mal umgestrickt:
Schön ist das nicht, funktioniert aber...
Das Problem ist aber ein ganz anderes: os.stat()[stat.ST_MODE] liefert ein viel umfasserendes octal Schema zurück, als die einfache 3er Geschichte, die der Sourceocode oben abdeckt...
stat liefert z.B. solche Werte: 33188, 16877
Keine Ahnung wie man die behandeln sollte...
In dem zusammenhang hab ich das gefunden:
http://svn.pythonpaste.org/Paste/Script ... ckperms.py
Macht aber genau das falsche... Es konvertiert von Symbolisch in octalzahl...
Ich hab Rafaels Vearinate mal umgestrickt:
Code: Alles auswählen
def trans_chmod(mod):
trans_data = {
"0": "---",
"1": "--x",
"2": "-w-",
"3": "-wx",
"4": "r--",
"5": "r-x",
"6": "rw-",
"7": "rwx",
}
mod_string = "%04d" % mod
mod_string = mod_string[-3:]
return ''.join(trans_data[num] for num in mod_string)
Das Problem ist aber ein ganz anderes: os.stat()[stat.ST_MODE] liefert ein viel umfasserendes octal Schema zurück, als die einfache 3er Geschichte, die der Sourceocode oben abdeckt...
stat liefert z.B. solche Werte: 33188, 16877
Keine Ahnung wie man die behandeln sollte...
In dem zusammenhang hab ich das gefunden:
http://svn.pythonpaste.org/Paste/Script ... ckperms.py
Macht aber genau das falsche... Es konvertiert von Symbolisch in octalzahl...
Es gibt ja mehr als die 9 Statusbits. Sticky- und SUID-Bit zum Beispiel. Wenn Du nur die "rwx"-Bits haben willst, musst Du die Bits über dem 9. ausblenden:
Code: Alles auswählen
In [13]: os.stat('test.py').st_mode
Out[13]: 33252
In [14]: os.stat('test.py').st_mode & 0777
Out[14]: 484
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Wäre eine schnelle Lösung und auch erstmal akzeptabel für mich, wobei natürlich alle Informationen schon nett wären...
Das "ausblenden" klappt aber so nicht:
33188 -> 420
16877 -> 493
Das "ausblenden" klappt aber so nicht:
33188 -> 420
16877 -> 493
Code: Alles auswählen
for fn in sorted(os.listdir(".")):
mode = os.stat(fn).st_mode
print "%s -> %s" % (mode, mode & 0777)
Was sind denn die Rechte zu den dazugehörigen Dateien? Zum Vergleichen bietet es sich an die Zahl als Oktalzahl dar zu stellen (Formatcode '%o').
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das ist es!
Bsp:
Code: Alles auswählen
def trans_chmod(mod):
trans_data = {
"0": "---",
"1": "--x",
"2": "-w-",
"3": "-wx",
"4": "r--",
"5": "r-x",
"6": "rw-",
"7": "rwx",
}
result = []
mod = mod & 0777 # strip "meta info"
mod_string = "%o" % mod
return ''.join(trans_data[num] for num in mod_string)
for fn in sorted(os.listdir(".")):
#~ print fn
mode = os.stat(fn).st_mode
print "%o -> %o" % (mode, mode & 0777)
print trans_chmod(mode)
print "="*80
Das werde ich erstmal nutzten...100644 -> 644
rw-r--r--
================================================================================
40755 -> 755
rwxr-xr-x
================================================================================