Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Приложение к уроку
Управление правами доступа
На самом деле речь идёт об одном методе библиотеки os — chmod(). Но вопрос тянет за собой ещё вопросы, что было мной показано в виде-уроке. Функция chmode() имеет следующую структуру запуска
os.chmode(pfl, mode, dir_fd=None, follow_symlinks=True)
- pfl — имя файла (краткое, полное, относительное), которому будут меня права доступа.
- mode — число с битами, определяющими права доступа.
- dir_fd — путь относительно дескриптор каталога.
- follow_symlinks — переходить ли по символьной ссылке. Т.е. менять права доступа у файла или каталога, который указывает ссылка.
В большинстве случаев используются только два первых параметра, принимая остальные по-умолчанию.
Самым важным параметром является mode, вот на нём мы и остановимся подробнее.
Для изменения структуры прав доступа обычно используется число в 8-ричном формате. Три младших разряда для стандартного изменения прав доступа, 4-й разряд для изменения дополнительных бит прав доступа.
Прежде, чем рассмотреть структуру mode, оговорим, как определяются права доступа в Linux-системах.
Стандартные права доступа и для файлов и для каталогов делятся на три группы
- Право чтения. Для каталога отсутствие этого права означает не возможность чтения содержимого каталога.
- Право записи. Для каталога отсутствие этого права означает не возможность создавать в каталоге файлы и не возможность удалить файл.
- Право запуска. Для каталога отсутствие этого права означает не возможность сделать этот каталог текущим.
Эти права доступа применяются по отношению
- Владельца файла или каталога.
- Группы, связанной с данным файлом или каталогов, обычно это группа владельца.
- Всех остальных пользователей.
Все три перечисленных субъекта могут иметь по отношению к объекту (файлу или каталогу) набор тех или иных указанных выше прав или не иметь их вообще.
Все три права имеют числовое, точнее битовое выражение: право запускать — 1 (бит 0), право записывать — 2 (бит 1), право читать — 4 (бит 2). Набор прав, таким образом определяется числами от 0 до 7. При этом полный набор прав для трех указанных субъектов выражается восьмеричным числом. Например
750 — владелец имеет все возможные права по отношению к данному объекту, группа имеет право запускать и право читать, все остальные прав не имеют никаких. Рассмотрим фрагмент
#!/usr/bin/python3
import os
pt = input()
print(oct(os.stat(pt).st_mode))
md = int(input(), 8)
os.chmod(pt, md)
print(oct(os.stat(pt).st_mode))
Кстати os.stat(pt).st_mode — получить права доступа указанному файлу или каталогу. Вот запуск данной программы
Да, полученное значение mode имеет 6 восьмеричных разрядов, но для прав доступа нам нужно только три первых. Плюс четвертый разряд для специальных битов, о которых мы скажем ниже.
Обратимся теперь к специальным или дополнительным битам, которые определяются четвертым разрядом. На рисунке, кстати, четвёртый разряд равен 0, ну значит и биты эти равны нулю.
И так, по порядку.
- Sticky bit — когда-то этот бит использовался, чтобы оставлять в памяти, запущенную ранее программу. Это бит 0-й (равен 1). Если такой бит установлен, то программа по идее в следующий раз должна запуститься быстрее. Сейчас этот бит используется для каталогов. Если такой бит установлен у каталога, то удалить пользователь в этом каталоге может только свой файл.
- SUID (Set User ID) — это бит с номером 2 (равен 4). Данный бит используется для исполняемых файлов. Если такой бит установлен, то программа запускается с правами владельца. Очень важный момент. Если вдруг данная программа должна изменять какой-то файл, право на изменения которого у вас нет, то запуск программы с таким битом, позволяет управлять с файлом с правами владельца.
- SGID (Set Group ID) — это бит с номером 1 (равен 2). Когда этот бит установлен в исполняемом файле, то запуск осуществляется с правами группы этого файла. Если бит установлен на каталог, то создаваемые в нем объекты получают группу владельца каталога.
Программа, которая представлена может быть использована для и дополнительных битов. Например
Модуль stat имеет набор констант для всех указанных битов, объединить которые можно просто битовой командой 'ИЛИ'. Например
bt = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP
и использовать результат в методе os.chmode(). Лично я не использую эти константы, мне гораздо привычнее использовать числа в восьмеричной системе.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.