Права доступа определяют какие пользователи могут выполнять действия с каталогами или файлами. И также права доступа определяют какие именно действия могут выполнять пользователи над этими объектами
В операционных системах, таких как Windows, Linux и macOS, пользователи могут иметь следующие права доступа:
право на чтение (обозначается буквой «r» от английского «read»): позволяет пользователю читать содержимое файла или видеть содержимое каталога.
право на запись (обозначается буквой «w» от английского «write»): позволяет пользователю записывать или изменять содержимое файла. Для каталога данное право позволяет создавать и удалять файлы в этой папке.
право на выполнение (обозначается буквой «x от английского «execute»): позволяет пользователю выполнять файл, если это исполняемый файл (программа, скрипт и т. д.). Для каталога данное право разрешает перейти в эту папку.
Для указания права доступа используется совокупность перечисленных трех прав: это значит, что каждого файла или каталога нужно указать разрешено или запрещено право на чтение, запись и выполнение. Порядок указания важен, поэтому сперва указывается чтение, потом запись и только в конце выполнение.
Существует несколько способов записи прав доступа:
буквенная, в ней используются буквы «r», «w», «x» и знак «-» для указания запрета права
цифровая. Записывается либо в двоичной, либо в восьмеричной форме записи. В двоичной записи указывается три разряда, где «1» используется для разрешения права, а «0» - для запрета. Восьмеричная запись представляет собой просто перевод числа из двоичной формы
Ниже представлены все возможные варианты назначения права доступа в разных вариантах записи
Буквенная запись | Двоичная запись | Восьмеричная | Что доступно |
---|---|---|---|
--- | 000 | 0 | Ничего, так как в буквенной записи везде прочерки |
--x | 001 | 1 | Только выполнение |
-w- | 010 | 2 | Только запись |
-wx | 011 | 3 | Запись и выполнение |
r-- | 100 | 4 | Только чтение |
r-x | 101 | 5 | Чтение и выполнение |
rw- | 110 | 6 | Чтение и запись |
rwx | 111 | 7 | Чтение, запись и выполнение |
Для каждого файла (и папки) существует 3 категории пользователей:
Владелец файла или папки(Owner) - пользователь, создавший или владеющий файлом/каталогом
Группа (Group) - группа пользователей, в которую входит владелец
Остальные пользователи(Others) - все остальные пользователи системы, не являющиеся владельцем файла и не состоящие в группе.
Права для различных категорий пользователей как в цифровом, так и в буквенном представлении записываются последовательно: сперва указываются права для владельца, затем для группы и только в конце - для остальных пользователей.
При цифровой записи используется только восьмеричная форма представления, в которой первая цифра определяет права владельца, вторая — права группы, третья — права всех остальных пользователей.
При буквенной записи первые три символа определяют права владельца, вторые три определяют права группы, третьи три — права всех остальных пользователей.
Вот несколько примеров прав доступа:
Цифровая | Буквенная | Владелец | Группа | Остальные |
---|---|---|---|---|
755 | rwxr-xr-x | Полный доступ | Чтение и исполнение | Чтение и исполнение |
644 | rw-r--r-- | Запись и чтение | Только чтение | Только чтение |
600 | rw------- | Запись и чтение | Запрет на все | Запрет на все |
440 | r--r----- | Только чтение | Только чтение | Запрет на все |
Вот как в Windows выглядит интерфейс назначения прав
Существует несколько способов проверить права доступа к файлу или каталогу при помощи 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_OK
, os.W_OK
и os.X_OK
для проверки соответствующих прав доступа. Значения os.R_OK
, os.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. Там довольно часто возникают проблемы с назначением прав доступа.