Как управлять правами доступа к файлам в Linux с помощью Python

Ответ

В Python для управления правами доступа к файлам в Linux используются в основном модуль os в связке с модулем stat для стандартных POSIX-прав, а также внешние утилиты для расширенных прав (ACL).

1. Стандартные права (POSIX)

Для изменения прав доступа используется функция os.chmod(), а для получения — os.stat(). Константы для прав (например, "чтение для владельца") хранятся в модуле stat.

Пример:

import os
import stat

file_path = 'my_script.sh'

# Устанавливаем права 755 (rwxr-xr-x)
# Владелец: чтение, запись, исполнение
# Группа: чтение, исполнение
# Остальные: чтение, исполнение
permissions = stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH
os.chmod(file_path, permissions)

# Проверка установленных прав
current_mode = os.stat(file_path).st_mode
print(f"Права для {file_path}: {oct(current_mode)[-3:]}") # Вывод: Права для my_script.sh: 755

2. Использование subprocess

Как альтернативу можно вызывать системную утилиту chmod напрямую. Это проще для знакомых с shell-командами, но менее портируемо.

import subprocess

file_path = 'my_script.sh'
# Вызываем системную команду chmod 755 my_script.sh
subprocess.run(['chmod', '755', file_path], check=True)

3. Расширенные права (ACL)

Для более гранулярного контроля (например, выдачи прав конкретному пользователю, не являющемуся владельцем) используются Access Control Lists (ACL). Для работы с ними из Python можно установить библиотеку pylibacl.

Концепция: ACL позволяют задать права для нескольких пользователей и групп, а не только для стандартной тройки "владелец-группа-остальные".

Ответ 18+ 🔞

А, ну вот, смотри, это же про то, как в Питоне с файловыми правами на Линуксе шаманить. Тема, в общем-то, простая, но если не вникать — можно на ровном месте такую дичь натворить, что потом самому себе в сраку захочется чих-пых.

Короче, есть два основных подхода, как эту магию провернуть.

Первый — через родные модули os и stat. Это как бы правильный, питонистый путь. Тут ты не просто цифры 755 пишешь, а собираешь права из кусочков, как конструктор. Выглядит страшновато, но зато понятно, что за чем стоит.

import os
import stat

file_path = 'my_script.sh'

# Делаем файл исполняемым для всех, а владельцу ещё и писать можно
# Это те самые права 755 (rwxr-xr-x)
permissions = stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH
os.chmod(file_path, permissions)

# Смотрим, что наворотили
current_mode = os.stat(file_path).st_mode
print(f"Права для {file_path}: {oct(current_mode)[-3:]}") # Вывод: Права для my_script.sh: 755

Видишь эту кашу с stat.S_IRWXU? Это и есть кирпичики: «владельцу всё можно», «группе читать», «группе исполнять» и так далее. Собираешь их через | (это побитовое ИЛИ, если что) и получаешь нужную комбинацию. Удобно, ёпта, когда хочешь чётко понимать, что именно ты выставляешь, а не просто цифры тыкаешь.

Второй способ — для ленивых или для тех, кто с консоли не вылезает. Берёшь и тупо вызываешь системную команду chmod через subprocess. Просто, как три копейки, но менее переносимо. Если твой скрипт вдруг на системе без chmod окажется (хотя где ж такой Линукс найдётся?), то он накроется медным тазом.

import subprocess

file_path = 'my_script.sh'
# По сути, кричишь из Питона в систему: «Эй, chmod, сделай мне 755 на этот файл!»
subprocess.run(['chmod', '755', file_path], check=True)

Ну и наконец, третий вариант — для параноиков и системных администраторов, у которых доверия ебать ноль. Когда стандартных прав «владелец-группа-остальные» уже не хватает. Вот представь: нужно дать доступ не просто группе, а конкретному Васе из отдела тестирования, который даже в группу разработчиков не входит. Вот тут в игру вступают ACL (Access Control Lists).

Для работы с ними из Питона обычно ставят библиотеку pylibacl. Это уже высший пилотаж, когда нужно раздавать права с точностью до конкретного юзера. Концепция, в общем, простая: ACL — это как расширенная версия прав, где можно навесить правила не на три абстрактные сущности, а на кого угодно. Мощная штука, но и ответственность, блядь, соответствующая — можно так настроить, что потом сам черт ногу сломит.

Вот, вкратце, и всё. Выбирай способ под задачу. Не хочешь заморачиваться — subprocess в помощь. Хочешь чётко и по-взрослому — os.chmod с stat. Ну а если тебе нужно раздать права пол-офиса, а другую половину выгнать — welcome to ACL, дружок.