Найти в Дзене
programmer's notes (python and more)

Стандартные библиотеки в Python. Библиотека os. Права доступа к файлам и каталогам. Приложение к видео 11

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Приложение к уроку

Управление правами доступа

На самом деле речь идёт об одном методе библиотеки oschmod(). Но вопрос тянет за собой ещё вопросы, что было мной показано в виде-уроке. Функция 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.

Что вы мне тут про Ruby рассказываете. Вы писали на FoxPto когда-нибудь?
Что вы мне тут про Ruby рассказываете. Вы писали на FoxPto когда-нибудь?