python - 杀死通过 sudo 启动的子进程

标签 python subprocess sudo

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

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

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

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

我没有可以关闭的子进程的打开管道(子进程未从标准输入读取),我无法修改子进程的代码。

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

最佳答案

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

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

通用规则是:

  1. 如果您需要 super 用户权限,您应该将它们授予父进程。
  2. 如果子进程需要执行特权操作,它会请求顶级进程为他执行此操作。
  3. 顶层流程应尽可能小,并尽可能少做。它越大,造成的安全漏洞就越多。

这就是许多应用程序所做的。我想到的第一个例子是 Apache 网络服务器(至少在 *nix 上),它有一个小的顶级程序和预 fork 的工作程序,这些程序不是以 root/wheel/whatever-else-is-the-superuser- 运行的用户名。

关于python - 杀死通过 sudo 启动的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886828/

相关文章:

python - Pyramid 登录和注销页面返回 404,应用程序的其余部分工作正常

python - 无法在 EC2(CentOS)上安装 psycopg 3

python - 当我编写一个 python 脚本来使用配置 "Debug|Win32"运行 Devenv 时,它什么都不做

python - 如何使用子进程和 Popen 从长时间运行的进程返回标准输出?

linux - 如何在 bash 脚本中切换到和退出 root

python - 自定义域路由到 Flask 服务器,自定义域始终显示在地址栏中

python - gunicorn + gevent monkey 是否自动将 threadlocals 修补为 greenlet-locals?

python: 无法打开文件 'python DACscrap.py &' : [Errno 2] 没有这样的文件或目录...但是它有吗?

linux - 为什么我在 bash 中的 sudo 命令不能通过 crontab 执行?

.net - 使用WinSCP .NET程序集运行命令sudo bash