以spdo身份运行python调用

时间:2014-10-21 18:13:30

标签: python root sudo

我们有一个以root身份运行的python安装脚本,目前我们希望以sudoer用户的身份运行它,并具有一组权限。问题是我们的代码充满了os.makedirs和open(filename)等。

open(filename) as sudo ?
os.makedirs as sudo ?
... as sudo ?

不适合我们的解决方案:

  1. 将整个设置脚本运行为" sudo python script.py" 这对我们来说是一个安全问题。我们需要避免它。

  2. POPEN(["须藤"" ..."]) 这对非unix系统支持很不利,并且需要重写所有代码。

2 个答案:

答案 0 :(得分:0)

我对要求#2有牛肉。你需要sudo怎么样但你还需要与平台无关?如果那真的是你想要的,你必须重新考虑要求#1,或者检测你所在的操作系统,如果你在* nix上,则用sudo作为命令的前缀。此外,除了使用sudo运行整个脚本之外,您还必须更改代码,因此#2的一部分是静音点。但是,在Popen命令中使用sudo是没有意义的。您必须为必须运行的特定命令启用无密码sudo,而IMO比使用UID 0运行整个脚本更具风险。但是,您似乎只是在与文件系统进行交互,而有人评论说确实提出的问题是,您是否可以授予您的用户访问所需文件的权限?

Tl; dr让运行程序权限的用户访问这些文件,或者退后一步,问问自己为什么会出现这个问题,这是解决问题的最佳方法

答案 1 :(得分:0)

一般情况下,当您的一小段代码必须以提升的权限运行时,但以这种方式运行其余代码并不安全,您可以执行以下操作:

您以root身份运行主脚本。但是在启动时,它会分叉或生成子进程(仍然是root用户),然后立即删除权限。当您需要以root身份执行某些操作时,您可以使用一些足够安全的IPC机制(socketpair可能或可能不够安全,具体取决于您的设计的其余部分......)要求孩子在您代表并发回回复。 Windows的细节略有不同,但可以使用相同的基本想法。


然而,还有其他选择,包括:

  • 创建setuid程序,并将其作为非root父项的子项运行。这个在Windows上是不可行的,当你处理子脚本时,它可能不适合在Unix上使用。
  • 将您的应用重新设计为守护进程/服务,该守护进程/服务是单独管理的(通常由您的系统的守护程序/服务管理器)并以root身份运行,主应用程序通过IPC与守护进程通信。
  • 存储可用于根据需要模拟root的凭据(理想情况下,仅在短期子进程或线程上)。这个在Windows上运行良好,但在Unix上运行得不好。

然而,在这种情况下,有一个更简单的解决方案:您似乎唯一需要root权限的是读取(并且可能写入?)您安装为不同用户所拥有的文件。只需将这些文件设置为组可读(可能是可写的),然后将该脚本作为该组成员的有限权限用户运行。