Права доступа в Python

Что такое «Права доступа» в файловой системе

Права доступа определяют какие пользователи могут выполнять действия с каталогами или файлами. И также права доступа определяют какие именно действия могут выполнять пользователи над этими объектами

В операционных системах, таких как Windows, Linux и macOS, пользователи могут иметь следующие права доступа:

  1. право на чтение (обозначается буквой «r» от английского «read»): позволяет пользователю читать содержимое файла или видеть содержимое каталога.

  2. право на запись (обозначается буквой «w» от английского «write»): позволяет пользователю записывать или изменять содержимое файла. Для каталога данное право позволяет создавать и удалять файлы в этой папке.

  3. право на выполнение (обозначается буквой «x от английского «execute»): позволяет пользователю выполнять файл, если это исполняемый файл (программа, скрипт и т. д.). Для каталога данное право разрешает перейти в эту папку.

Для указания права доступа используется совокупность перечисленных трех прав: это значит, что каждого файла или каталога нужно указать разрешено или запрещено право на чтение, запись и выполнение. Порядок указания важен, поэтому сперва указывается чтение, потом запись и только в конце выполнение. 

Существует несколько способов записи прав доступа:

  • буквенная, в ней используются буквы «r», «w», «x» и знак «-» для указания запрета права

  • цифровая. Записывается либо в двоичной, либо в восьмеричной форме записи. В двоичной записи указывается три разряда, где «1» используется для разрешения права, а «0» - для запрета. Восьмеричная запись представляет собой просто перевод числа из двоичной формы

Ниже представлены все возможные варианты назначения права доступа в разных вариантах записи

Буквенная записьДвоичная записьВосьмеричнаяЧто доступно
---0000Ничего, так как в буквенной записи везде прочерки
--x0011Только выполнение
-w-0102Только запись
-wx0113Запись и выполнение
r--1004Только чтение
r-x1015Чтение и выполнение
rw-1106Чтение и запись
rwx1117Чтение, запись и выполнение

 

Категории пользователей

Для каждого файла (и папки) существует 3 категории пользователей:

  1. Владелец файла или папки(Owner) - пользователь, создавший или владеющий файлом/каталогом

  2. Группа (Group) - группа пользователей, в которую входит владелец

  3. Остальные пользователи(Others) - все остальные пользователи системы, не являющиеся владельцем файла и не состоящие в группе.

Права для различных категорий пользователей как в цифровом, так и в буквенном представлении записываются последовательно: сперва указываются права для владельца, затем для группы и только в конце - для остальных пользователей. 

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

При буквенной записи первые три символа определяют права владельца, вторые три определяют права группы, третьи три — права всех остальных пользователей.

Вот несколько примеров прав доступа:

ЦифроваяБуквеннаяВладелецГруппаОстальные
755rwxr-xr-xПолный доступЧтение и исполнениеЧтение и исполнение
644rw-r--r--Запись и чтениеТолько чтениеТолько чтение
600rw-------Запись и чтениеЗапрет на всеЗапрет на все
440r--r-----Только чтениеТолько чтениеЗапрет на все

Вот как в Windows выглядит интерфейс назначения прав

 

Проверка прав доступа в Python

Существует несколько способов проверить права доступа к файлу или каталогу при помощи Python, а именно:

  • функция os.access

  • функция os.stat

 

Функция os.access

Функция os.access() позволяет узнать есть ли определенный доступ к файлу или нет. Результатом функции os.access()будет True, если доступ разрешен, False, если нет.

os.access(path, mode)

Функция os.access имеет следующие параметры:

  • path - путь к файлу или каталогу
     

  • mode - проверяемый доступ, может принимать значения os.F_OK для проверки существования пути или  os.R_OKos.W_OK и os.X_OK для проверки соответствующих прав доступа. Значения os.R_OKos.W_OK и os.X_OK можно объединять при помощи побитового ИЛИ '|'.

При вызове функция os.access внутри себя получает идентификаторы пользователя и группы, от которого был запущен скрип и проверяет по ним доступ к переданному файлу. 

import os

print('Файл:', __file__)
print('Существует:', os.access(__file__, os.F_OK))
print('Право на чтение:', os.access(__file__, os.R_OK))
print('Право на запись:', os.access(__file__, os.W_OK))
print('Право на исполнение:', os.access(__file__, os.X_OK))

print('Чтение и исполнение:', os.access(__file__, os.R_OK | os.X_OK))
print('Чтение и запись:', os.access(__file__, os.R_OK | os.W_OK))

К сожалению, функцию os.access может только ответить на вопрос, существует ли у пользователя определенное право. Полной информации о правах доступа данная функция не предоставляет. 

Файл: /Volumes/Mac SSD/Project/PyHub/pillow/enc.py
Существует: True
Право на чтение: True
Право на запись: True
Право на исполнение: True
Чтение и исполнение: True
Чтение и запись: True

 

 

Функция os.stat

Функция os.stat позволяет получить подробную информацию о файле

os.stat(path)

Функция os.stat принимает  путь к файлу или каталогу path и возвращает объект os.stat_result, в атрибутах которого содержится полезная информация о файле. Например, вы можете получить следующие данные:

  • размер файла, содержится в атрибуте st_size

  • доступы к файлу, содержится в атрибуте st_mode

  • идентификатор владелец файла, содержится в атрибуте st_uid

  • время создания файла, содержится в атрибуте st_ctime

  • время последнего изменения файла, содержится в атрибуте st_mtime

  • время последнего доступа к файлу, содержится в атрибуте st_atime

import os
import time

filename = __file__

stat_info = os.stat(filename)

print(f'File: {filename}')
print('Size:', stat_info.st_size)
print('Permissions:', oct(stat_info.st_mode))
print('Owner:', stat_info.st_uid)
print('Device:', stat_info.st_dev)
print('Created      :', time.ctime(stat_info.st_ctime))
print('Last modified:', time.ctime(stat_info.st_mtime))
print('Last accessed:', time.ctime(stat_info.st_atime))

Получим следующий результат:

File: /Volumes/Mac SSD/Project/PyHub/os_project/main.py
Size: 418
Permissions: 0o100644
Owner: 501
Device: 16777241
Created      : Sat Nov  2 14:31:50 2024
Last modified: Sat Nov  2 14:31:50 2024
Last accessed: Tue Oct 29 17:50:34 2024

Обратите внимание на строку, где выводится информация о правах доступа

Permissions: 0o100644

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

Изменение прав доступа 

Для того, чтобы изменить права доступа к файлу или каталогу необходимо использовать функцию os.chmod

os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)

Мы разберем только первые два параметра данной функции, остальные можете прочитать в документации:

  • path - путь к файлу или каталогу в файловой системе

  • mode - режим доступа, который хотите установить для файла. Значение mode может принимать последние 3 цифры восьмеричного представления числа, например 0o755 или одно или несколько значений, на которые вы можете взглянуть в документации.

На мой взгляд, проще всего передать значение параметра mode при помощи восьмеричной записи числа. Вот взгляните на пример ниже

import os
import stat

filename = 'text.txt'

mode = os.stat(filename).st_mode
print(stat.filemode(mode))

os.chmod(filename, 0o777)

mode = os.stat(filename).st_mode
print(stat.filemode(mode))

В нем сперва параметры доступы у файла были

-rw-r--r--

что соответствовало восьмеричной записи 0o644. А затем мы поменяли на значение 0o777 и программа стала показывать следующую буквенную запись

-rwxrwxrwx

Будьте аккуратны с функцией chmod  при работе в Windows. Там довольно часто возникают проблемы с назначением прав доступа.

Перейти к следующему шагу

Комментарии