Проверка прав доступа к файлам в Linux с помощью Python
Я пишу скрипт для проверки прав доступа к файлам в каталогах пользователей, и если они неприемлемы, я буду предупреждать их, но я хочу проверить права доступа не только вошедшего в систему пользователя, но и группы и других. Как я могу это сделать? Мне кажется, что os.access()
в Python могут проверяться только разрешения для пользователя, выполняющего скрипт.
5 ответов
Вы правы в том, что os.access, как и основной системный вызов доступа, проверяет конкретного пользователя (реальные, а не эффективные идентификаторы, чтобы помочь в ситуациях suid).
os.stat - это правильный способ получить более общую информацию о файле, включая разрешения для пользователя, группы и других. st_mode
атрибут объекта, который os.stat
Return имеет биты прав доступа к файлу.
Чтобы помочь интерпретировать эти биты, вы можете использовать модуль статистики. В частности, вам понадобятся битовые маски, определенные здесь, и вы будете использовать &
оператор (бит-и), чтобы использовать их, чтобы замаскировать соответствующие биты в этом 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
вызов может быть несколько дорогостоящим, поэтому убедитесь, что вы извлекаете всю информацию, которая вас интересует, одним вызовом, а не повторяете вызовы для каждого интересующего вас бита;-).
Просто чтобы помочь другим людям, таким как я, которые пришли сюда для чего-то немного другого:
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.
Смотрите это для более подробной информации: /questions/36742910/kak-ya-mogu-poluchit-masku-razresheniya-fajla/36742946#36742946
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
Вы можете проверить права доступа к файлам через os.stat(path)
в сочетании с stat
модуль для интерпретации результатов.
Использование os.access()
с флагами os.R_OK
, os.W_OK
, а также os.X_OK
,
Изменить: Проверьте этот связанный вопрос, если вы тестируете разрешения каталогов в Windows.