Недавно я использую модуль Python os, когда я пытался изменить права доступа к файлу, я не получил ожидаемого результата. Например, я намеревался изменить разрешение на rw-rw-r--,
os.chmod("/tmp/test_file", 664)
Право собственности на самом деле -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Однако, если я изменю в коде с 664 на 0664, результат будет именно тем, что мне нужно, например
os.chmod("/tmp/test_file", 0664)
Результат:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Может ли кто-нибудь помочь объяснить, почему этот ведущий 0 так важен для получения правильного результата?
python
file
permissions
chmod
AplusG
источник
источник
Ответы:
Нашел это на другом форуме
То, что вы делаете, - это передача,
664
которая в восьмеричном формате1230
В вашем случае вам понадобится
[Обновление] Обратите внимание, что для Python 3 у вас есть префикс с 0o (ноль о). НАПРИМЕР,
0o666
источник
1
это не исключено ! Это бит липкости / setuid / setgid, а 1 означаетsticky
. Используя,ls -l
вы можете заметить, что разрешения теперь включаютT
в себя ...Итак, для людей, которым нужна семантика, подобная:
Использование:
Если ваш Python старше 2.6:
источник
00755
, просто чтобы прояснить, где идут биты suid / sgid / sticky, в случае, если какой-то более поздний разработчик придет и захочет использовать этот старый скрипт, например, sgid с,2755
но затем не сможет понять, почему завивки полностью облажались. ;)впереди
0
означает, что это восьмеричная константа, а не десятичная. и вам нужно восьмеричное число, чтобы изменить режим файла.разрешения немного маски, например,
rwxrwx---
находится111111000
в двоичной системе , и это очень легко группы биты на 3 , чтобы преобразовать в восьмеричном, чем стоимости десятичного представления.0644
(восьмеричный) находится0.110.100.100
в двоичном формате (я добавил точки для удобства чтения) или, как вы можете вычислить,420
в десятичном.источник
Используйте символы разрешений вместо цифр
Вашей проблемы можно было бы избежать, если бы вы использовали более семантически названные символы разрешений, а не необработанные магические числа, например, для
664
:Это задокументировано на https://docs.python.org/3/library/os.html#os.chmod, а имена совпадают со значениями API POSIX C, задокументированными на
man 2 stat
.Еще одним преимуществом является большая переносимость, как указано в документации:
chmod +x
демонстрируется на странице: Как сделать простой "chmod + x" изнутри Python?Протестировано в Ubuntu 16.04, Python 3.5.2.
источник
Если у вас есть желаемые разрешения, сохраненные в строке, выполните
источник
Использование битовых масок stat. * Действительно кажется мне наиболее переносимым и явным способом сделать это. Но с другой стороны, я часто забываю, как лучше с этим справиться. Итак, вот пример маскировки разрешений «группа» и «другие» и оставления разрешений «владельца» нетронутыми. Использование битовых масок и вычитания - полезный паттерн.
источник