检查非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下绝对路径

Windows无法访问指定设备,路径或文件怎么办

覆盖 Windows 中的系统环境变量路径(非管理员访问权限)

mac 修改用户权限

最大前驱路径

如何设置 NGINX,使根域名不可访问,但是其他非根路径可以访问