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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 14. Februar 2008, 09:06

Hab das mal auf der Wiki Seite übernommen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Dienstag 6. September 2011, 16:24

Hab mit http://wiki.python.de/755%20-%3E%20rwxr-xr-x nochmal angesehen.

Was soll ich sagen, alle drei Beispiele funktionieren nicht wirklich:

Code: Alles auswählen

def symbolic_notation1(mode):
    """
    >>> symbolic_notation1(644)
    u'rw-r--r--'
    >>> symbolic_notation1(40755)
    u'rwxr-xr-x'
    >>> symbolic_notation1("777")
    u'rwxrwxrwx'
    """
    return ''.join(
        mode & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx')
    )

def symbolic_notation2(mode):
    """
    >>> symbolic_notation2(644)
    u'rw-r--r--'
    >>> symbolic_notation2(40755)
    u'rwxr-xr-x'
    >>> symbolic_notation2("777")
    u'rwxrwxrwx'
    """
    result = []
    for i, x in enumerate('rwxrwxrwx'):
        m = mode & 0400 >> i
        symbol = m and x or '-'
        result.append(symbol)

    return ''.join(result)


CHMOD_TRANS_DATA = (
    u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx",
)
def symbolic_notation3(mode):
    """
    >>> symbolic_notation3(644)
    u'rw-r--r--'
    >>> symbolic_notation3(40755)
    u'rwxr-xr-x'
    >>> symbolic_notation3("777")
    u'rwxrwxrwx'
    """
    mode = mode & 0777 # strip "meta info"
    mode_string = u"%o" % mode

    return u''.join(CHMOD_TRANS_DATA[int(num)] for num in mode_string)

if __name__ == "__main__":
    import doctest
    print doctest.testmod(verbose=False)

Ausgaben:

Code: Alles auswählen

...
3 items had failures:
   3 of   3 in __main__.symbolic_notation1
   3 of   3 in __main__.symbolic_notation2
   3 of   3 in __main__.symbolic_notation3
***Test Failed*** 9 failures.
TestResults(failed=9, attempted=9)


:shock:


Meine Aktuelle Lösung, die auch funktioniert:

Code: Alles auswählen

CHMOD_TRANS_DATA = (
    u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx"
)
def chmod_symbol(octal_value):
    """
    Transform a os.stat().st_octal_value octal value to a symbolic string.
    ignores meta infromation like SUID, SGID or the Sticky-Bit.
    e.g. 40755 -> rwxr-xr-x
    >>> chmod_symbol(644)
    u'rw-r--r--'
    >>> chmod_symbol(40755)
    u'rwxr-xr-x'
    >>> chmod_symbol("777")
    u'rwxrwxrwx'
    """
    octal_value_string = str(octal_value)[-3:] # strip "meta info"
    return u''.join(CHMOD_TRANS_DATA[int(num)] for num in octal_value_string)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

Beitragvon sma » Mittwoch 7. September 2011, 10:19

Warum nicht einfach so?

Code: Alles auswählen

def chmod_sym(val):
    def tripple(v):
        return "-r"[bool(v & 4)] + "-w"[bool(v & 2)] + "-x"[bool(v & 1)]
    return tripple(val / 64) + tripple(val / 8) + tripple(val)

Wobei das mit dem bool zugegebenermaßen ein bisschen trickreich ist - aber kürzer als ein if/else ;)
Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Mittwoch 7. September 2011, 10:24

Tut's nicht (btw. Code ist im Forum Falsch, wegen: viewtopic.php?f=10&t=22855 ):

Code: Alles auswählen

def chmod_sym(val):
    """
    >>> chmod_sym(644)
    u'rw-r--r--'
    >>> chmod_sym(40755)
    u'rwxr-xr-x'
    >>> chmod_sym("777")
    u'rwxrwxrwx'
    """
    val = int(val)
    def tripple(v):
        return "-r"[bool(v & 4)] + "-w"[bool(v & 2)] + "-x"[bool(v & 1)]
    return tripple(val / 64) + tripple(val / 8) + tripple(val)

if __name__ == "__main__":
    import doctest
    print doctest.testmod(verbose=False)

Code: Alles auswählen

**********************************************************************
File "test.py", line 4, in __main__.chmod_sym
Failed example:
    chmod_sym(644)
Expected:
    u'rw-r--r--'
Got:
    '-w----r--'
**********************************************************************
File "test.py", line 6, in __main__.chmod_sym
Failed example:
    chmod_sym(40755)
Expected:
    u'rwxr-xr-x'
Got:
    'r--rw--wx'
**********************************************************************
File "test.py", line 8, in __main__.chmod_sym
Failed example:
    chmod_sym("777")
Expected:
    u'rwxrwxrwx'
Got:
    'r----x--x'
**********************************************************************
1 items had failures:
   3 of   3 in __main__.chmod_sym
***Test Failed*** 3 failures.
TestResults(failed=3, attempted=3)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
/me
User
Beiträge: 3188
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

Beitragvon /me » Mittwoch 7. September 2011, 10:51

jens hat geschrieben:Tut's nicht

Der Code von sma hätte die Zahlen gerne explizit als Oktalzahl angegeben. Damit schlägt zwangsläufig jeder der bestehenden Tests fehl.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

Beitragvon sma » Mittwoch 7. September 2011, 10:58

Tut sehr wohl, weil 644 eben nicht 0644 ist. Wie "/me" schon schrieb, ich erwarte natürlich die korrekte Zahl, also beispielsweise 420 oder 0x1a4 oder eben 0644. Das sind ja nur drei verschiedene Repräsentationen für die Zahl, die hinter rw-r--r-- steht.

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Mittwoch 7. September 2011, 11:13

sma hat geschrieben:also beispielsweise 420 oder 0x1a4 oder eben 0644. Das sind ja nur drei verschiedene Repräsentationen für die Zahl

Hm. Die kann man allerdings nicht wirklich gut unterscheiden, oder? Also das man die Funktion mit allem füttern kann...

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

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

Beitragvon Leonidas » Mittwoch 7. September 2011, 11:23

Man kann zumindest eine Bereichsprüfung machen, wenn die Zahl größer 0777 ist, dann ist sie mit ziemlicher Sicherheit falsch.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

Beitragvon sma » Mittwoch 7. September 2011, 11:43

Jenseits von 511 sind noch weitere Flags. Meiner Funktion ist das aber egal, die werden einfach ignoriert.

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Mittwoch 7. September 2011, 13:03

jens hat geschrieben:Hab mit http://wiki.python.de/755%20-%3E%20rwxr-xr-x nochmal angesehen.

Was soll ich sagen, alle drei Beispiele funktionieren nicht wirklich:

OK, mein Fehler...

Es geht ja eigentlich um die Umwandlung von os.stat().st_mode und dabei bekommt man halt die Zahl in Octal...

EDIT: Hab das mal im Wiki versucht zu erklären: http://wiki.python.de/755%20-%3E%20rwxr ... 2=7&rev1=6

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

Beitragvon sma » Mittwoch 7. September 2011, 16:15

jens hat geschrieben:Es geht ja eigentlich um die Umwandlung von os.stat().st_mode und dabei bekommt man halt die Zahl in Octal...


Das ist ein Missverständnis. Das gibt in Python keine Zahlen in Okal, Hex, oder was auch immer. Es sind einfach Zahlen, also Objekte vom Typ "int". Wenn etwas als "rw-r--r--" per "ls" angezeigt wird, liefert stat().st_mode da die Zahl 420, die man auch als 0644 ausdrücken kann, aber die immer noch 420 ist. Äh, tatsächlich kommt da 33188 zurück, jedenfalls bei mir, weil da wohl noch irgend so ein OS/X-spezifisches Bit gesetzt ist, aber das ist auch nur 0b1000000110100100 und da sieht man rechts die üblichen Access-Bits "644".

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Mittwoch 7. September 2011, 16:42

Kannst du mal ein Blick auf http://wiki.python.de/755%20-%3E%20rwxr ... 2=7&rev1=6 werfen, ob das dann so einigermaßen richtig ist?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

Beitragvon sma » Mittwoch 7. September 2011, 17:06

Nein, das ist IMHO nicht richtig, denn da wird keine Zahl im Octal-Mode zurückgegeben oder übergeben. Einfach nur eine Zahl. In Oktaldarstellung erkennt man die gewohnten Muster 644 oder 755, aber das ist nur ein Muster. Genauso könnte man sich 110100100 bzw. 111101101 gemerkt haben und immer die Binärdarstellung bevorzugen. Ja, wer im Kopf schnell teilen kann, kommt vielleicht mit 420 klar.

Ich habe mir erlaubt, dass mal im Wiki anzupassen.

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Mittwoch 7. September 2011, 17:13

sma hat geschrieben:Ich habe mir erlaubt, dass mal im Wiki anzupassen.

Das ist der Sinn des Wikis :wink:

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder