Ostatnio używam systemu operacyjnego Python, gdy próbowałem zmienić uprawnienia pliku, nie uzyskałem oczekiwanego wyniku. Na przykład zamierzałem zmienić pozwolenie na rw-rw-r--,
os.chmod("/tmp/test_file", 664)
Uprawnienie do własności to w rzeczywistości -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Jeśli jednak zmienię w kodzie 664 na 0664 to wynik jest właśnie tym, czego potrzebuję np
os.chmod("/tmp/test_file", 0664)
Wynik to:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Czy ktoś mógłby pomóc wyjaśnić, dlaczego to wiodące 0 jest tak ważne dla uzyskania prawidłowego wyniku?
python
file
permissions
chmod
AplusG
źródło
źródło
Odpowiedzi:
Znalazłem to na innym forum
To, co robisz, to mijanie,
664
co jest ósemkowe1230
W twoim przypadku potrzebujesz
[Aktualizacja] Uwaga, dla Pythona 3 masz prefiks 0o (zero oh). NA PRZYKŁAD,
0o666
źródło
1
jest odrzucany! To jest bit sticky / setuid / setgid, a 1 oznacza . Używając możesz zauważyć, że uprawnienia obejmują teraz na końcu ...sticky
ls -l
T
Więc dla ludzi, którzy chcą semantyki podobnej do:
Posługiwać się:
Jeśli Twój Python jest starszy niż 2.6:
źródło
00755
, tylko po to, aby wyjaśnić, gdzie idą bity suid / sgid / sticky, na wypadek, gdyby przyszedł jakiś późniejszy programista i chciałby, aby ten stary skrypt używał, na przykład, sgid with,2755
ale potem nie może zrozumieć, dlaczego perms są całkowicie schrzanione. ;)wiodący
0
oznacza, że jest to stała ósemkowa , a nie dziesiętna. i potrzebujesz ósemkowego do zmiany trybu pliku.uprawnienia to maska bitowa, na przykład
rwxrwx---
jest111111000
binarna i bardzo łatwo jest pogrupować bity po 3, aby przekonwertować je na liczbę ósemkową, niż obliczyć reprezentację dziesiętną.0644
(ósemkowe) jest0.110.100.100
binarne (dodałem kropki dla czytelności) lub, jak możesz obliczyć,420
dziesiętnie.źródło
Użyj symboli uprawnień zamiast liczb
Twój problem zostałby uniknięty, gdybyś użył bardziej semantycznie nazwanych symboli uprawnień zamiast surowych liczb magicznych, np. Dla
664
:Jest to udokumentowane na https://docs.python.org/3/library/os.html#os.chmod, a nazwy są takie same, jak wartości POSIX C API udokumentowane w
man 2 stat
.Kolejną zaletą jest większa przenośność, jak wspomniano w dokumentach:
chmod +x
jest zademonstrowane na: Jak wykonać proste „chmod + x” z poziomu Pythona?Testowane w Ubuntu 16.04, Python 3.5.2.
źródło
Jeśli masz żądane uprawnienia zapisane w łańcuchu znaków, zrób to
źródło
Używanie masek stat. * Bit wydaje mi się najbardziej przenośnym i jednoznacznym sposobem na zrobienie tego. Ale z drugiej strony często zapominam, jak najlepiej sobie z tym poradzić. Oto przykład zamaskowania uprawnień „grupy” i „innych” oraz pozostawienia nietkniętych uprawnień „właściciela”. Używanie masek bitowych i odejmowania jest przydatnym wzorcem.
źródło