python:sudo上下文管理器?

时间:2014-03-12 07:02:03

标签: python sudo contextmanager

有没有办法实现一个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)),那就太优雅了。

1 个答案:

答案 0 :(得分:1)

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

可能可以实现sudo样式上下文管理器,而不是通过使常规Python代码运行特权,而是临时替换进行各种OS调用的库代码(例如open使用某种代理将文件连接到setuid帮助程序。但要让这样的东西起作用会有很多工作要做,还有很多工作要确保它足够安全,可以在生产的任何地方使用。

一个想法,如果您不喜欢当前使用system调用中的shell脚本的解决方案:使用常规Python代码使用常规用户权限编写文件。然后使用chownsudo {{1}}(并在必要时移动它)。