Проверка прав доступа к файлам в Linux с помощью Python - PullRequest
58 голосов
/ 07 декабря 2009

Я пишу скрипт для проверки прав доступа к файлам в каталогах пользователя, и если они не будут приемлемы, я буду предупреждать их, но я хочу проверить права доступа не только вошедшего в систему пользователя, но и группы и других. , Как я могу это сделать? Мне кажется, что os.access() в Python может проверять разрешения только для пользователя, выполняющего скрипт.

Ответы [ 6 ]

93 голосов
/ 07 декабря 2009

Вы правы, что os.access , как и базовый системный вызов access , проверяет конкретного пользователя (реальные, а не эффективные идентификаторы, чтобы помочь в ситуациях suid).

os.stat - это правильный способ получить более общую информацию о файле, включая разрешения для пользователя, группы и других. Атрибут st_mode объекта, который возвращает os.stat, имеет биты прав доступа для файла.

Чтобы помочь интерпретировать эти биты, вы можете использовать модуль stat . В частности, вам нужно, чтобы битовые маски были определены здесь , и вы будете использовать оператор & (bit-and), чтобы использовать их для маскировки соответствующих битов в этом атрибуте 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 может быть довольно дорогостоящим, поэтому обязательно извлекайте всю информацию, которая вас интересует, одним вызовом, а не повторяйте вызовы для каждого интересующего вас бита; -).

9 голосов
/ 07 декабря 2009

Вы можете проверить права доступа к файлу через os.stat(path) в сочетании с модулем stat для интерпретации результатов.

8 голосов
/ 07 декабря 2009

Используйте os.access() с флагами os.R_OK, os.W_OK и os.X_OK.

Редактировать : Проверьте этот связанный вопрос , если вы проверяете права доступа к каталогам в Windows.

6 голосов
/ 08 августа 2017

Просто чтобы помочь другим людям, таким как я, которые пришли сюда для чего-то немного другого:

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.

См. Это для более подробной информации: https://stackoverflow.com/a/5337329/1814774

3 голосов
/ 07 декабря 2009

os.stat и соответствующие битовые маски для режима.

1 голос
/ 24 июня 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...