Dateirechte ermitteln & 755 -> rwxr-xr-x ???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?
Zuletzt geändert von jens am Montag 11. Februar 2008, 20:07, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Jens,

Hilft Dir os.access weiter? Oder möchtest Du doch was Anderes erfahren?

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, das sieht schon mal nicht schlecht aus, dank dir ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Existiert eigentlich irgendwo eine Routine um os.stat()[stat.ST_MODE] von Oktalnotation auf Symbolische Notation umzuformen ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich hab nun lange rumgesucht, aber nichts in der Richtung gefunden :(
Kennt jemand eine Routine dafür?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ich nicht. Wenn niemand eine Alternative weiß: Selber rechnen oder os.access mehrmals aufrufen, um die vollständige Info zu erhalten.

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich kann mir einfach nicht vorstellen, das es nicht schon irgendjemand mal implementiert hat... Aber nach nochmaligem suchen hab ich immer noch keinen Ansatz gefunden :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Z. B. -rwxr-xr-x für 755.

edit: zu langsam
Leonidas
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):

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)
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Die einfache Methode: http://paste.pocoo.org/show/27137/
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.
Jap, hab ich auch schon dran rumgeknobelt.
Benutzeravatar
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'))
bin() halt geeignet implementieren oder Py3k benutzen :D
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

rafael hat geschrieben:Die einfache Methode: http://paste.pocoo.org/show/27137/
Das sieht gut aus, aber warum kein dict nutzten? Werde ich morgen mal umschreiben...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:
rafael hat geschrieben:Die einfache Methode: http://paste.pocoo.org/show/27137/
Das sieht gut aus, aber warum kein dict nutzten?
Und noch dazu iterativ? Das geht ja mal gar nicht :P

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. 8)

Edit: birkenfeld, cool. Das ist mal was nicht-langweiliges :idea:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
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:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

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
Benutzeravatar
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

Code: Alles auswählen

for fn in sorted(os.listdir(".")):
    mode = os.stat(fn).st_mode
    print "%s -> %s" % (mode, mode & 0777)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

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').
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das ist es!

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
Bsp:
100644 -> 644
rw-r--r--
================================================================================
40755 -> 755
rwxr-xr-x
================================================================================
Das werde ich erstmal nutzten...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten