python:sudo上下文管理器?

buk*_*zor 9 python sudo contextmanager

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

system('whoami')  # same result as echo $USER
with sudo():
    system('whoami')  # root
Run Code Online (Sandbox Code Playgroud)

我怀疑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)).

Blc*_*ght 1

我怀疑这不可能以任何简单的方式实现。升级权限的程序sudo必须在其文件系统权限中设置一个标志(即“setuid”位),以便告诉操作系统以与启动它们的用户不同的用户身份运行它们。除非您希望整个 Python 解释器都是 setuid root,否则没有直接的方法可以对 Python 代码的一小部分执行等效操作。

可以想象,实现样式上下文管理器不是通过使常规 Python 代码以特权运行的方式实现,而是通过使用某种将其连接到的代理sudo临时替换进行各种操作系统调用(例如读取文件)的库代码。opensetuid 帮助程序。但要让这样的东西发挥作用需要做大量的工作,并且需要做更多的工作来确保它足够安全,可以在生产中的任何地方使用。

如果您不喜欢当前通过调用使用 shell 脚本的解决方案,一个想法是system:使用常规 Python 代码和常规用户权限编写文件。然后chown通过调用(并在必要时移动它)进行sudo调用。