检查非root用户是不是可以访问路径
Posted
技术标签:
【中文标题】检查非root用户是不是可以访问路径【英文标题】:Check if path accessible by non-root user检查非root用户是否可以访问路径 【发布时间】:2011-10-01 08:09:55 【问题描述】:我有一个用 Python(在 Linux 中)编写的安装脚本,它以 root 身份运行,需要检查某些文件是否可以被非 root 用户读取。
出于这个原因,我不能使用 os.path.exists() 或 open(filename) (并捕获任何异常)。
目前我正在考虑检查每个文件的权限位,但唯一的问题是我还必须检查通向文件名的路径上的权限位(目录需要 r+x 位set),如果我有数千个文件,这可能会非常缓慢。
我的解决方案是最好的,还是有更好的选择?
编辑:检查文件后,我需要以 root 身份运行脚本,因此很遗憾,删除 root 权限不是一个选项。
【问题讨论】:
【参考方案1】:您可以使用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-'
【讨论】:
65534 在大多数现代操作系统(除了 Windows)上都没有,但它并不存在于所有 posix 系统上。便携式应用程序可能需要做更多的工作来猜测一个非常好的 euid。也许应用程序应该尝试以root身份读取passwd文件(以确保它存在),然后尝试以65534读取passwd文件(以确保它缺少权限,异常==成功),然后尝试读取目标文件如65534(实际检查权限),如果前两个失败,则通知用户自己检查权限。 这种方法的唯一问题是我需要在检查文件后以 root 身份运行脚本。 @teehoo:您可以使用os.seteuid(0)
将有效用户重置为root。
@unutbu 这行得通!不知道您可以重新获得 root 权限,谢谢!
@teehoo:对。您可以重置有效用户 ID,但不能重置真实用户 ID。 (即os.setuid(0)
会引发OSError
)。以上是关于检查非root用户是不是可以访问路径的主要内容,如果未能解决你的问题,请参考以下文章
XAMPP环境访问非Web DocumentRoot下绝对路径