2012-05-24 41 views
6

Pytanie:

jaki sposób efektywnie korzystać z funkcji stat uzyskać znaczące uprawnienia do plików (użytkownika, grupy i inne).Korzystanie z funkcji stat Pythona, aby skutecznie pozbyć się właściciela, grupy i innych uprawnień

Szczegóły:

ja zapytań uprawnienia pliku tak:

statInfo = os.stat 
permissions = stat.S_IMODE (os.stat ('fooBar.txt').st_mode) 

to przywrócenie uprawnienia w postaci dziesiętnej. Jeśli więc fooBar.txt ma uprawnienia do pliku ósemkowego 0700, tutaj permissions jest ustawiona na wartość dziesiętną 448. Co chcę jest ustawiony 9 zmiennych dla każdego uprawnienia (ownerRead, ownerWright, ownerExecute, groupRead ...) Jeśli miałem zamiar to zrobić, chciałbym wykorzystać brute force metody tak:

statInfo = os.stat 
permissions = stat.S_IMODE (os.stat ('fooBar.txt').st_mode) 
octPermissions = oct (permissions) 

ownerRead = octPermissions [1] >= 4 
ownerWrite = octPermissions [1] == 2 or octPermissions [1] == 6 or octPermissions [1] == 3 or 
ownerExecute = octPermissions [1] == 1 or octPermissions [1] == 5 or octPermissions [1] == 3 

Czy istnieje skuteczniejszy sposób robienia tego bez konieczności konwersji na ósemkowy, ponieważ funkcja ta zostanie wywołana całkiem sporo?

+0

Trzeba tylko zaznaczyć nazwiska jak 'global' jeśli zamierzamy je zmieniać . Ponieważ wątpię, że będziesz modyfikował moduły "os" i "stat", nie musisz ich nigdzie oznaczać jako "globalne". –

+0

oops, mój zły, skopiowałem to z wewnątrz funkcji – puk

+0

Wiem, zgadłem. Pozwól, że ci jeszcze powiem: nie musisz deklarować tych "globalnych", ponieważ będą automatycznie wyszukiwane z zakresu modułów bez tego. –

Odpowiedz

5

Można użyć bitowego i operator:

m = os.stat('fooBar.txt').st_mode 
otherExec = bool(m & 0001) 
otherWrite = bool(m & 0002) 
otherRead = bool(m & 0004) 
groupExec = bool(m & 0010) 
groupWrite = bool(m & 0020) 
groupRead = bool(m & 0040) 
... 
+0

genialny! Dziękuję – puk

5

Używaj bitowego AND i stałych w stat module:

import stat 
import os 

mode = os.stat('fooBar.txt').st_mode 

otherRead = bool(mode & stat.S_IROTH) 
otherWrite = bool(mode & stat.S_IWOTH) 
otherExec = bool(mode & stat.S_IXOTH) 
... 

Tyle bardziej czytelny.

+1

dziękuję, właśnie skończyłem perfekcyjne dopasowanie moich "0100" i "0010" – puk

3

Wrzuciłem to razem do funkcji, które dostaje uprawnienia UNIX:

import os 
from stat import (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, 
        S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH) 

def bit2int(bit): 
    return int(oct(bit)) 

def convert_st_mode(st_mode): 
    bits = (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, 
      S_IROTH, S_IWOTH, S_IXOTH) 
    mode = "%03d" % sum(int(bool(st_mode & bit)) * bit2int(bit) for bit in bits) 
    return mode 

def get_unix_permissions(pth): 
    mode = convert_st_mode(os.stat(pth).st_mode) 
    return mode 

Zastosowanie:

mode = get_unix_permissions("somefile") 
print(mode)