杀死通过sudo启动的子进程

时间:2014-02-19 16:43:24

标签: python subprocess sudo

在我正在开发的项目中,有一些代码使用sudo启动了一个长时间运行的进程:

subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])

我想在父母退出时清理这个过程。目前,子进程在父进程退出时保持运行(当然,重新附加到init)。

我不确定这个问题的最佳解决方案。代码仅限于通过sudo运行某些命令,并且授予运行sudo kill的一揽子权限最多也是粗略的。

我没有可以关闭子进程的开放管道(子进程没有从stdin读取),我无法修改子进程的代码。

在这种情况下是否还有其他可能有效的机制?

2 个答案:

答案 0 :(得分:5)

首先,我回答这个问题。虽然我认为这不是一件好事,但这正是你所要求的。我会将该子进程包装成一个可以监听stdin的小程序。然后你可以sudo该程序,它将能够在没有sudo的情况下运行该进程,并且知道它的pid并拥有在你通过它时要求它终止进程的权限stdin这样做。

但是,通常这种情况意味着sudo没有密码和安全性差。最常见的技术是使用降低程序的权限,而不是提升它们。在这种情况下,您应该创建一个由超级用户启动的运行程序,而不是通过降低权限启动主程序并侦听管道进行通信。当需要运行一个命令时,你的主程序告诉跑步者程序,跑步者程序完成这项工作。当需要终止命令时,再次通过管道将其告知转轮程序。

通用规则是:

  1. 如果您需要超级用户权限,则应将其提供给父进程。
  2. 如果子进程需要执行特权操作,它会请求顶级进程为他执行此操作。
  3. 顶级流程应尽可能小,尽可能少。它越大,它产生的安全漏洞就越多。
  4. 这就是许多应用程序所做的事情。我想到的第一个例子是Apache Web服务器(至少在* nix上),它有一个小的顶级程序和preforked工作程序,它们不是以root / wheel / what-else-is-the-superuser-运行的 - 用户名。

答案 1 :(得分:0)

这将在最后一行引发OSError: [Errno 1] Operation not permitted

p = subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])
print p.stdout.read()
p.terminate()

假设sudo不会要求输入密码,一个解决方法是创建一个调用sudo的shell脚本...

#!/bin/sh
sudo /usr/bin/somecommand

...然后在Python中执行此操作:

p = subprocess.Popen("/path/to/script.sh", cwd="/path/to")
print p.stdout.read()
p.terminate()