Python:sudo上下文管理器?

9

是否有可能实现一个sudo上下文管理器,将封闭范围作为另一个用户运行,使用sudoers系统?

system('whoami')  # same result as echo $USER
with sudo():
    system('whoami')  # root

我怀疑sudo(8)可执行文件对我有帮助,但也许有一些C级接口可以绑定?


动机:我几乎可以完全将此shell脚本移植到Python上,甚至没有任何子进程,但目前我必须使用system('sudo sh -c“ echo%i> /dev/thatfile”%value)。如果我能用with sudo(),open('/ dev / thatfile','w')as thatfile:thatfile.write(str(value))就太优雅了。


fabric 中有 sudo 命令,你可能需要查看 fabric 源代码以了解它是如何实现的。 - J0HN
@J0HN:我简单地看了一下。它似乎只是在稍后由ssh执行的命令前面添加“sudo”。我的目标(如果可能的话)是在没有shell的情况下完成这样的操作。 - bukzor
1个回答

1
我怀疑这不可能以任何简单的方式实现。像sudo这样提升权限的程序必须在其文件系统权限中设置一个标志(即“setuid”位),以告诉操作系统将它们作为不同于启动它们的用户的用户运行。除非你希望整个Python解释器都是setuid root,否则没有直接的方法来仅针对一些小部分Python代码执行类似操作。
也许可以通过临时替换使各种操作系统调用(例如打开文件)的库代码为某种代理连接到setuid辅助程序而不是使常规Python代码特权化来实现sudo风格的上下文管理器。但要让这样的东西正常工作需要很多工作,而要确保它足够安全以在生产环境中使用则需要更多的工作。
如果您不喜欢使用system调用的shell脚本的当前解决方案,则可以使用常规Python代码编写文件,并使用您的常规用户权限进行chown(并在必要时移动它)与sudo调用。

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