python:sudo上下文管理器?

python:sudo上下文管理器?,python,sudo,contextmanager,Python,Sudo,Contextmanager,是否有任何可能的方法来实现一个sudo上下文管理器,它使用sudoers系统以另一个用户的身份运行封闭范围 system('whoami') # same result as echo $USER with sudo(): system('whoami') # root 我怀疑sudo(8)可执行文件是否会对我有所帮助,但也许有一些C级接口可以绑定 动机:我几乎可以将这个shell脚本完全移植到python,甚至不需要任何子进程,除了我目前必须system('sudosh-c“e

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

system('whoami')  # same result as echo $USER
with sudo():
    system('whoami')  # root
我怀疑
sudo(8)
可执行文件是否会对我有所帮助,但也许有一些C级接口可以绑定



动机:我几乎可以将这个shell脚本完全移植到python,甚至不需要任何子进程,除了我目前必须
system('sudosh-c“echo%I>/dev/thatfile”'%value)
。如果我能用sudo()打开('/dev/thatfile',w')作为thatfile:thatfile.write(str(value)),那将是非常优雅的,我怀疑这在任何简单的方式下都是不可能的。升级权限的程序(如
sudo
)必须在其文件系统权限中设置一个标志(即“setuid”位),以便告诉操作系统以不同于启动它们的用户的身份运行它们。除非您希望整个Python解释器都是setuid root,否则就没有直接的方法来为Python代码的一小部分做等效的事情

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


如果您不喜欢当前使用
系统
调用中的shell脚本的解决方案,那么您可以这样做:使用常规Python代码编写文件,并具有常规用户权限。然后使用
sudo
调用
chown
它(并在必要时移动它)。

中有
sudo
命令,您可能需要查看fabric源代码以查看它是如何在那里完成的。@J0HN:我简单地看了一下。看起来它只是在ssh稍后执行的命令前面加上了“sudo”。我的目标(如果可能的话)是在没有外壳的情况下做到这一点。