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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 09:13

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Dienstag 12. Februar 2008, 09:58

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 10:03

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)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Dienstag 12. Februar 2008, 10:25

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 10:29

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tux21b
User
Beiträge: 18
Registriert: Mittwoch 15. Februar 2006, 23:20
Wohnort: Linz.at
Kontaktdaten:

Dienstag 12. Februar 2008, 11:08

Warum braucht ihr da alle so ein eigenartiges Dict mit allen möglichen Permutationen? Ihr könnt einfach die Bits durchgehen...

Code: Alles auswählen

import os

def symbolic_notation(mode):
    notation = list(reversed('rwxrwxrwx'))
    return ''.join(mode & 2**i and notation[i] or '-' for i in range(8, -1, -1))
    
print symbolic_notation(os.stat('blub').st_mode)
Das ganze sollte auch relativ leicht um Sticky-Bits etc. erweiterbar sein...

Gruß
Christoph
[url]http://www.ubuntuusers.de[/url]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 13:15

So, ich hab es nun mal eingebaut: http://pylucid.net:8080/pylucid/changeset/1389

Das ganze steckt im zusätzlichen django template filter, hier: http://pylucid.net:8080/pylucid/browser ... y?rev=1389

@tux21b: Natürlich ist ein daten dict mit allen Permutationen etwas unschön. Aber ich finde die Variante viel einfach zu lesen als deine. Ich weiß auf den ersten Blick nicht, wie deine Variante arbeitet...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 12. Februar 2008, 15:23

Jens, dein dict ist doch Quatsch, wenn es von 0 bis 7 geht, da gibts so ne Struktur die heißt Listen, genau für sowas.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 15:28

Jep stimmt! Und noch besser, ein tuple nehmen ;)
http://pylucid.net:8080/pylucid/changeset/1393

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Dienstag 12. Februar 2008, 15:55

Und nun bitte noch ``result = []`` entfernen. :-)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Februar 2008, 16:09


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tux21b
User
Beiträge: 18
Registriert: Mittwoch 15. Februar 2006, 23:20
Wohnort: Linz.at
Kontaktdaten:

Dienstag 12. Februar 2008, 21:40

jens hat geschrieben:@tux21b: Natürlich ist ein daten dict mit allen Permutationen etwas unschön. Aber ich finde die Variante viel einfach zu lesen als deine. Ich weiß auf den ersten Blick nicht, wie deine Variante arbeitet...
Liegt wohl daran, dass ich das ganze sehr kurz gefasst habe, aber vom Algorithmus her finde ich die Variante doch um einiges verständlicher.

Kurz gesagt, du gehst alle Bits der Reihe nach durch, schaust nach ob es gesetzt ist und wenn ja, zeigst du das symbol dafür an und ansonsten einen '-'.
[url]http://www.ubuntuusers.de[/url]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 13. Februar 2008, 09:03

OK, versuchen wir das mal auseinander zu nehmen (Fragen, siehe Kommentar):

Code: Alles auswählen

import os

CHMOD_TRANS_DATA = ("x","w","r")*3

def symbolic_notation(mode):
    result = []
    for i in xrange(8, -1, -1):
        # Wie kann man "m" besser benennen???
        m = mode & 2**i 

        # Was passiert hier genau?
        symbols = m and CHMOD_TRANS_DATA[i] or '-'

        result.append(symbols)

    return ''.join(result)

test_data = (0100000, 0100123, 0100456, 0100765)
for mode in test_data:

    print "%o -> %s" % (mode, symbolic_notation(mode))
    print "="*80
EDIT: Hab mal eine Wiki Seite angelegt: [wiki]755 -> rwxr-xr-x[/wiki](Doller Name, oder?)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 13. Februar 2008, 14:19

Oder so:

Code: Alles auswählen

>>> ''.join(0755 & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx'))
'rwxr-xr-x'
MfG
HWK
tux21b
User
Beiträge: 18
Registriert: Mittwoch 15. Februar 2006, 23:20
Wohnort: Linz.at
Kontaktdaten:

Mittwoch 13. Februar 2008, 22:58

HWK hat geschrieben:Oder so:

Code: Alles auswählen

>>> ''.join(0755 & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx'))
'rwxr-xr-x'
MfG
HWK
Das gefällt mir. enumerate ist verständlicher, und das ganze ist nocheinmal kürzer :D
[url]http://www.ubuntuusers.de[/url]
Antworten