Я пишу скрипт для проверки прав доступа к файлам в пользовательских каталогах, и если они неприемлемы, я буду предупреждать их, но я хочу проверить права доступа не только вошедшего в систему пользователя, но и группы и других. Как я могу это сделать? Мне кажется, что os.access()
в Python может проверять разрешения только для пользователя, выполняющего скрипт.
Проверка разрешений файлов в Linux с помощью Python
Ответ 1
Вы правы, что os.access, как базовый access, проверяет для конкретного пользователя (реальные, а не эффективные идентификаторы, чтобы справиться с ситуациями suid).
os.stat - это правильный способ получить более общую информацию о файле, включая разрешения для каждого пользователя, группы и других. Атрибут st_mode
объекта, возвращаемого os.stat
, имеет бит разрешения для файла.
Чтобы интерпретировать эти биты, вы можете использовать модуль stat. В частности, вы захотите, чтобы битмаски определяли здесь, и вы будете использовать оператор &
(бит-и), чтобы использовать их для маскировки вывести соответствующие биты в этот атрибут st_mode
- например, если вам просто нужна проверка True/False, является ли определенный файл доступным для группы, один из подходов:
import os
import stat
def isgroupreadable(filepath):
st = os.stat(filepath)
return bool(st.st_mode & stat.S_IRGRP)
Позаботьтесь: вызов os.stat
может быть несколько дорогостоящим, поэтому обязательно извлекайте всю информацию, о которой вы заботитесь, с помощью одного вызова, вместо того, чтобы повторять вызовы для каждой части интереса; -).
Ответ 2
Вы можете проверить права доступа к файлам через os.stat(path)
в сочетании с stat
для интерпретации результатов.
Ответ 3
Используйте os.access()
с флагами os.R_OK
, os.W_OK
и os.X_OK
.
Изменить: проверьте этот связанный вопрос, если вы проверяете права на доступ к каталогам в Windows.
Ответ 4
Просто чтобы помочь другим людям, таким как я, которые пришли сюда для чего-то другого:
import os
import stat
st = os.stat(yourfile)
oct_perm = oct(st.st_mode)
print(oct_perm)
>>> 0o100664 //the last 3 or 4 digits is probably what you want.
Смотрите это для более подробной информации: fooobar.com/questions/81886/...
Ответ 5
Ответ 6
import os
os.access('my_file', os.R_OK) # Check for read access
os.access('my_file', os.W_OK) # Check for write access
os.access('my_file', os.X_OK) # Check for execution access
os.access('my_file', os.F_OK) # Check for existence of file