杀死通过sudo启动的子进程

lar*_*sks 5 python sudo subprocess

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

subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])
Run Code Online (Sandbox Code Playgroud)

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

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

我没有一个打开管道到我可以关闭的子进程(子进程不是从stdin读取),我无法修改子进程的代码.

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

Ell*_*ioh 5

首先,我回答这个问题.虽然我认为这不是一件好事,但这正是你所要求的.我会把那个子进程包装成一个可以监听的小程序stdin.那么你可以使用sudo该程序,它将能够在没有的情况下运行该进程sudo,并且pid当你要求它stdin执行时,它将知道它并且拥有杀死进程所需的权限.

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

共同规则是:

  1. 如果您需要超级用户权限,则应将其提供给父进程.
  2. 如果子进程需要执行特权操作,它会请求顶级进程为他执行此操作.
  3. 顶级流程应尽可能小,尽可能少.它越大,它产生的安全漏洞就越多.

这就是许多应用程序所做的事情.我想到的第一个例子是Apache Web服务器(至少在*nix上),它有一个小的顶级程序和preforked工作程序,它们不是以root/wheel/what-else-is-the-superuser-运行的 - 用户名.