Глядя на вывод strace
, perl выполняет вызов stat()
, за которым следует getgroups()
, чтобы получить идентификаторы дополнительных групп процесса perl.Похоже, он просто проверяет результаты вызова stat()
по EUID, EGID и дополнительным идентификаторам групп.
Python имеет функцию getgroups()
в os
, поэтому я уверен, что вы могли быто же самое.
РЕДАКТИРОВАТЬ: Вы можете попробовать что-то вроде этого, если никто не придумал лучшего ответа.(С трудом проверено):
def effectively_readable(path):
import os, stat
uid = os.getuid()
euid = os.geteuid()
gid = os.getgid()
egid = os.getegid()
# This is probably true most of the time, so just let os.access()
# handle it. Avoids potential bugs in the rest of this function.
if uid == euid and gid == egid:
return os.access(path, os.R_OK)
st = os.stat(path)
# This may be wrong depending on the semantics of your OS.
# i.e. if the file is -------r--, does the owner have access or not?
if st.st_uid == euid:
return st.st_mode & stat.S_IRUSR != 0
# See comment for UID check above.
groups = os.getgroups()
if st.st_gid == egid or st.st_gid in groups:
return st.st_mode & stat.S_IRGRP != 0
return st.st_mode & stat.S_IROTH != 0
Очевидно, что -w будет почти идентичным, но с W_OK, S_IWUSR и т. Д.