Обновляет ли path.mkdir () права доступа к файлу, если путь уже существует и режим пройден? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть том, вложенный в kubernetes с путем /var/www/aaa/tmp.

Этот том был создан с использованием path.mkdir () и в настоящее время имеет разрешения 755. Первоначально он был создан с кодом path.mkdir(parents=True, exist_ok=True).

Я пытаюсь обновить его разрешения, не удаляя существующий путь.

Я использую path.mkdir(parents=True, exist_ok=True, mode=0o777). Я по-прежнему сталкиваюсь с проблемами, связанными с разрешениями и получением 502 Bad gateway для приложения flask, которое создает вышеуказанные каталоги.

Обновляет ли path.mkdir(parents=True, exist_ok=True, mode=0o777) разрешения пути, если оно уже существует и имеет 755 разрешения? Или он будет полностью игнорировать это, как мы упоминали exists_ok=True? Я не вижу обновлений разрешений для пути.

Должен ли я полностью удалить путь и повторно запустить path.mkdir..... с mode=0o777, который создает новые каталоги и устанавливает разрешения?

Редактировать 1: I ' мы пытались использовать os.chmod() на пути. Но он выбрасывает PermissionError.

Вот фрагмент кода.

path.mkdir(parents=True, exist_ok=True)
os.chmod(path, mode=0o777)

Ошибка:

Файл "./app/ init .py ", строка 79, в файле create_prediction_app create_directories (app)" ./app/init.py ", строка 36, в файлах create_directories os.chmod (путь, режим = 0o777) PermissionError: [Errno 1] Операция не разрешена: '/ var / www/aaa/tmp' невозможно загрузить приложение 0 (точка монтирования = '') (вызываемый объект не найден или ошибка импорта) * приложение не загружено. ИГРА НАД *

1 Ответ

2 голосов
/ 03 февраля 2020

Если путь уже существует, вместо удаления / повторного создания следует использовать os.chmod(path, mode).

Например:

import os

os.chmod("/var/www/aaa/tmp", 0o777)

Более того chmod может получить разрешение от модуля stat.

  • stat.S_ISUID - Установить идентификатор пользователя при выполнении.
  • stat.S_ISGID - Установить идентификатор группы при выполнении.
  • stat.S_ENFMT - принудительная блокировка записи.
  • stat.S_ISVTX - сохранение текстового изображения после выполнения.
  • stat.S_IREAD - чтение владельцем.
  • stat.S_IWRITE - Запись владельцем.
  • stat.S_IEXE C - Выполнение владельцем.
  • stat.S_IRWXU - Чтение, запись и выполнение владельцем.
  • stat.S_IRUSR - чтение владельцем.
  • stat.S_IWUSR - запись владельцем.
  • stat.S_IXUSR - выполнение владельцем.
  • stat.S_IRWXG - чтение, запись, и выполнить по группе.
  • stat.S_IRGRP - чтение по группе.
  • stat.S_IWGRP - запись по группе.
  • stat.S_IXGRP - выполнение по группе. * 104 2 *
  • stat.S_IRWXO - чтение, запись и выполнение другими.
  • stat.S_IROTH - чтение другими.
  • stat.S_IWOTH - запись другими.
  • stat.S_IXOTH - Выполнить другими.

Например:

import os
import stat

# Set a file write by others.
os.chmod("/var/www/aaa/tmp", stat.S_IWOTH)

Вы можете установить дополнительные разрешения с помощью побитового оператора.

Например:

import os
import stat

os.chmod(
    '/var/www/aaa/tmp',
    stat.S_IRUSR |
    stat.S_IROTH |
    stat.S_IRGRP 
)

Полное тестирование:

>>> touch test_perm.sh
>>> ll test_perm.sh
-rw-rw-r-- test_perm.sh
>>> python -c "import os; os.chmod('test_perm.sh', 0755)"
>>> ll test_perm.sh
-rwxr-xr-x test_perm.sh

РЕДАКТИРОВАТЬ:

Если вы получаете исключение PermissionError: [Errno 1] Operation not permitted:..., когда хотите изменить разрешение с помощью os.chmod, попробуйте следующую часть кода, чтобы решить ее. Важно запустить скрипт с правами администратора (с sudo в Linux среде).

Код:

from getpwnam import pwd
from getgrnam import grp
import os

uid = getpwnam("USERNAME")[2]
gid = grp.getgrnam("GROUPNAME")[2]
os.chown("/var/www/aaa/tmp", uid, gid)

На основании официальной chown документации:

os.chown (path, uid, gid , *, dir_fd = Нет, follow_symlinks = True)

Изменить владельца и идентификатор группы пути на цифры c uid и gid. Чтобы оставить один из идентификаторов без изменений, установите для него значение -1. ​​

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

См. Shutil.chown ( ) для функции более высокого уровня, которая принимает имена в дополнение к цифрам c идентификаторам.

Доступность: Unix.

Новое в версии 3.3: добавлена ​​поддержка указания пути как открытого дескриптор файла и аргументы dir_fd и follow_symlinks.

Изменено в версии 3.6: Поддерживается объект типа пути.

Ссылка на документацию: https://docs.python.org/3/library/os.html#os .chown

...