在我正在进行的项目中,有一些代码使用 sudo
启动了一个长时间运行的进程:
subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])
我想在父进程退出时清理这个进程。目前,子进程在父进程退出时继续运行(当然,重新附加到 init
)。
我不确定这个问题的最佳解决方案。该代码仅限于通过 sudo 运行某些命令,并且授予运行 sudo kill
的一揽子权限充其量是粗略的。
我没有可以关闭的子进程的打开管道(子进程未从标准输入读取),我无法修改子进程的代码。
在这种情况下是否还有其他机制可行?
最佳答案
首先我只是回答问题。虽然我不认为这是一件好事,但这是你要求的。我会将那个子进程包装到一个可以监听 stdin
的小程序中。然后你可以 sudo
那个程序,它将能够在没有 sudo
的情况下运行该进程,并且会知道它的 pid
并拥有所需的权限当您通过 stdin
请求它时终止进程。
不过一般这种情况都是sudo
没有密码,安全性差。最常见的技术是使用降低程序的权限,而不是提升它们。在这种情况下,您应该创建一个由 super 用户启动的运行程序,而不是它以降低权限启动您的主程序并监听管道进行通信。当需要运行一个命令时,你的主程序会告诉运行程序,运行程序会完成这项工作。当需要终止命令时,您再次通过管道将其告知运行程序。
通用规则是:
- 如果您需要 super 用户权限,您应该将它们授予父进程。
- 如果子进程需要执行特权操作,它会请求顶级进程为他执行此操作。
- 顶层流程应尽可能小,并尽可能少做。它越大,造成的安全漏洞就越多。
这就是许多应用程序所做的。我想到的第一个例子是 Apache 网络服务器(至少在 *nix 上),它有一个小的顶级程序和预 fork 的工作程序,这些程序不是以 root/wheel/whatever-else-is-the-superuser- 运行的用户名。
关于python - 杀死通过 sudo 启动的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886828/