【问题标题】: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 权限不是一个选项。

【问题讨论】:

    标签: python linux file-permissions


    【解决方案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)。
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多