Как лучше всего использовать os.makedirs (), когда режим игнорируется - PullRequest
0 голосов
/ 12 июня 2011

На сервере Linux, над которым я работаю, мне нужно создать каталоги со следующей структурой:

/ dir1 / dir2 / dir3 / YYYY / MM / DD / file.ext

В некоторых случаях (поскольку каталоги зависят от даты) мне нужно создавать более одного каталога за раз, например ... / 2011/01/01 /, причем все они нуждаются в разрешении 0o2755 .

Когда я использую os.makedirs (dir, mode = 0o2755) на моем сервере, он правильно устанавливает часть разрешения 0o755, но игнорирует бит SGID (2). Я предполагаю, что это из-за того, что os.makedirs игнорирует разрешения в некоторых системах, как описано в документации. Я читал, что у других людей были проблемы с umask и os.makedirs (), но я поиграл с umask (установленным на 0002, я пробовал 0000), и он все еще игнорирует бит SGID.

Мое решение для этого заключается в следующей функции:

def special_makedirs(base_dir, target_dir, mode=0o2755):
    base_dir = os.path.abspath(base_dir)
    target_dir = os.path.abspath(target_dir)
    if os.path.commonprefix([base_dir, target_dir]) != base_dir:
        log.error("Target directory %s is not a subdirectory of %s" %(target_dir, base_dir))
        raise ValueError("Target directory %s is not a subdirectory of %s" % (target_dir, base_dir))

    # Create initial directory
    os.makedirs(target_dir, mode=mode)

    # Verify permissions
    temp = target_dir
    while temp != base_dir and stat.S_IMODE(os.stat(temp)) != mode:
        os.chmod(temp, mode)
        temp = os.path.split(temp)[0]

Теперь я уверен, что это не соответствует всем случаям, но я буду единственным, кто использует эту функцию для своих конкретных нужд.

Итак ... мои вопросы:

  1. Я неправильно понимаю документацию os.makedirs, когда говорится, что в некоторых системах игнорируются разрешения? У других была эта проблема?

  2. Кажется ли моя функция наиболее эффективным способом решения этой проблемы?

Спасибо за любые советы, которые вы можете дать. Извините, если моя ситуация не имеет смысла.

1 Ответ

0 голосов
/ 12 июня 2011

Со страницы руководства mkdir(2):

NOTES
        Under  Linux  apart from the permission bits, only the S_ISVTX mode bit
        is honored.  That is, under Linux the created directory  actually  gets
        mode (mode & ~umask & 01777).

Так что да, SGID игнорируется.Установите это по факту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...