Что такое права доступа на файлы и директории в Linux
Что проверяют
Умеете ли вы работать с правами из кода, а не только в консоли. Питонист регулярно создаёт файлы, которые потом читает другой пользователь, сервис или контейнер, и вопрос обычно быстро сворачивает к тому, как не оставить секрет доступным всем.
Как отвечать
Модель та же, что в консоли: владелец, группа, остальные, по три бита на каждого, числовая запись вида 644, 755, 600. Из кода права меняет os.chmod, читает os.stat вместе с модулем stat, владельца меняет os.chown.
Обязательная деталь: режим записывается восьмеричным литералом. Значение 0o600 и значение 600 это разные числа и разные права, а ошибка тихая, потому что исключения не будет.
Второй важный момент: режим, переданный в создание файла или каталога, пропускается через umask процесса, поэтому запрошенные права почти никогда не совпадают с итоговыми. Если файл обязан быть закрытым, его не создают и потом чинят, а сразу открывают с нужным режимом, иначе между созданием и исправлением остаётся окно.
import os
fd = os.open("token", os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
with os.fdopen(fd, "w") as f:
f.write(token)Про каталоги стоит помнить, что бит исполнения это право войти, бит чтения только перечислить имена, а удаление файла регулируется правами каталога.
Где спотыкаются
Пишут режим десятичным числом без восьмеричного префикса и получают набор прав, который никто не собирался выдавать. Проверяется это одной строкой: вывести права обратно через stat и посмотреть на них в привычном виде.
Считают, что импортируемому модулю нужен бит исполнения. Он нужен только файлу, который запускают напрямую, и вместе с ним нужна первая строка с интерпретатором. Библиотеку достаточно уметь прочитать.
Ловят отказ в контейнере или на сборочном агенте и списывают на окружение. Обычно процесс просто идёт под другим числовым идентификатором, а права на смонтированный каталог остались от сборки на машине разработчика.