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))

4

1 回答 1

1

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

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

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

于 2014-03-12T08:28:40.380 回答