2016-05-09 6 views
0

Это ошибка или функция?python3 os.mkdir() не применяет правильный режим

Когда я создаю каталог с os.mkdir (idem с pathlib.Path.mkdir) и явным режимом, разрешения созданного каталога не подходят. Если я в жизнь с os.chmod снова, это работает ...

>>> import sys, os 
>>> sys.version 
'3.4.3 (default, Feb 27 2015, 18:13:37) \n[GCC 4.4.5]' 
>>> os.mkdir('truite', mode=0o2770) 
>>> oct(os.stat('truite').st_mode) 
'0o40750' 
>>> os.chmod('truite', 0o2770) 
>>> oct(os.stat('truite').st_mode) 
'0o42770' 

, так как я хотел, чтобы быть в состоянии сделать каталог с родителями и режимом o2770, вот код (pth является pathlib.Path объектом):

def make_shared_dir(pth) : 
    if not pth.parent.is_dir() : 
     make_shared_dir(pth.parent) 
    if not pth.is_dir() : 
     pth.mkdir() 
    pth.chmod(0o2770) 
+0

подтверждено с Ubuntu 14.04, Python 3.4.3. Согласно документам: в некоторых системах режим игнорируется. –

+0

Возможный дубликат [Проблемы с разрешением при создании каталога с os.makedirs (python)] (http://stackoverflow.com/questions/5231901/permission-problems-when-creating-a-dir-with-os-makedirs- python) –

ответ

2

Это особенность.

documentation упоминает об этом, хотя и кратко:

os.mkdir(path[, mode])

Создайте каталог с именем путь с режимом цифровой режим. Режим по умолчанию - 0777 (восьмеричный). В некоторых системах режим игнорируется. Где оно используется, текущее значение umask сначала маскируется.

umask является установкой для каждого процесса, который ограничивает права доступа, применяемые для всех вновь создаваемых файлов/каталогов.

Umask представляет собой число (обычно представлены в восьмеричном) так же, как сами разрешениях, но какие-либо бит, который установлен в UMASK является запрещено в результате разрешения. Например, если ваш umask равен 0o022 (обычный по умолчанию), новый созданный файл/каталог никогда не будет иметь разрешения на запись в группе или мире.

Разрешения на вновь созданные файлы/каталоги также всегда ограничены тремя последними восьмеричными цифрами (то есть 0o777). Поэтому, если ваш umask равен 0o022, все ведет себя так, как если бы это было действительно 0o7022. Вот почему ваш бит setgid также отбрасывается.

Кстати, это не вещь Питона; это вещь Unix. Это относится не только к Python, но и ко всем программам в Ubuntu. Вы можете проверить свой текущий umask, введя команду umask в свой терминал. Фактически, umask применяется в ядре Linux, когда он выполняет системный код mkdir(), который вызывает Python (и любая другая программа) для создания каталога.

Вы можете увидеть это для себя в the documentation for mkdir(): man 2 mkdir:

Аргумент режим указывает разрешения для использования. Она модифицируется UMASK текущего процесса обычным способом: права доступа созданного каталога являются (режим & ~ Umask & 0777).

Причина, конечно, безопасность.С помощью umask пользователи имеют большой контроль над разрешениями по умолчанию (например, блокировать разрешения чтения по умолчанию для мира или даже группы). Если вы хотите, чтобы файлы были липкими, setuid, setgid, group-writeable или world-writable (при условии, что 0o022 umask), вам нужно сделать это явно с помощью chmod.

+1

отличный ответ, более подробный, чем дубликат, спасибо :) – yota

Смежные вопросы