检查非root用户是否可以访问路径

6
我有一个用Python编写的安装脚本(在Linux中),以root身份运行并需要检查某些文件是否可被非root用户读取。
因此,我不能使用os.path.exists()或open(filename)(并捕获任何异常)。
目前,我考虑检查每个文件的权限位,但唯一的问题是还必须检查路径上到达文件名的权限位(目录需要设置r+x位),如果我有成千上万个文件,则可能会非常慢。
我的解决方案是最好的吗?还是有更好的选择?
编辑:不幸的是,经过检查文件后,我将需要以root身份运行脚本,因此放弃root权限不是一个选项。
1个回答

4

您可以使用os.seteuid将有效用户更改为某个非root用户。然后尝试打开文件。如果权限被拒绝,将引发IOError异常。

import os
os.seteuid(65534)  # user 65534 is `nobody`
filename='/etc/passwd-'
try:
    open(filename,'r')
except IOError as err:
    print(err)

# [Errno 13] Permission denied: '/etc/passwd-'

1
65534在大多数现代操作系统(除了Windows)中是无人用户,但并非所有posix系统都有。可移植应用程序可能需要更多的工作来猜测一个真正好的euid。也许应用程序应该尝试以root身份读取passwd文件(以确保它存在),然后尝试以65534身份读取passwd文件(以确保它缺少权限,异常==成功),然后尝试以65534身份读取目标文件(以实际检查权限),如果前两个失败,则通知用户检查权限。 - SingleNegationElimination
这种方法唯一的问题是,我需要在文件检查后以root身份运行脚本。 - Martin Konecny
@teehoo:你可以使用 os.seteuid(0) 将有效用户重置为 root。 - unutbu
@unutbu 这个方法可行!我不知道你可以重新获得root权限,谢谢! - Martin Konecny
@teehoo:没错。你可以重置有效用户ID,但不能重置真实用户ID。(即os.setuid(0)会引发OSError异常)。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接