【问题标题】:Spawn a subprocess in foreground, even after python exits在前台生成一个子进程,即使在 python 退出之后
【发布时间】:2014-04-21 10:49:24
【问题描述】:

假设存在一个python脚本resolve_ip.py,它神奇地返回我们关心的机器的字符串IP。

我有兴趣学习如何实现以下 bash 命令的 python 等效项:

user@host:~$ ssh $(./resolve_ip.py)

在这个 bash 示例中,在 python 脚本运行后,它被替换或替换为它的返回值,该返回值反过来作为程序 ssh 的输入提供。结果是,python 程序终止,用户与 ssh 初始化交互。

问题是,此解决方案需要使用 2 个脚本(一个运行 ssh 的 bash 脚本,结合 python 脚本返回参数)或人工干预,以按照上述格式直接键入 bash 命令。

问题:

有没有办法,只使用 python,通过使用子进程或一些类似的模块来启动/派生交互式服务(如 ssh),并让这个分叉的子进程在前台保持活动状态,即使在它的父进程之后(python ) 有 sys.exit() 吗?

注意事项:

在这种情况下,这个问题的重点不是编写脚本从 Python 中向 ssh 提交 ssh 凭据。它是如何生成一个子进程,该子进程在其父/生成器终止后继续在前台运行。

编辑: 以下资源是相关的:

【问题讨论】:

  • ssh 运行后是否需要 Python 做任何事情?

标签: python bash ssh subprocess fork


【解决方案1】:

我想你想“exec”。像这样:

import resolve_ip
import os
host = resolve_ip.get_host_to_use() # you figure this part out
os.execlp('ssh', 'ssh', host)

这将用 ssh 进程映像替换 Python 解释器进程映像,并继续运行。所以你最终会好像你运行的是 ssh 而不是 Python,解释器将不再执行。

【讨论】:

  • execlp 来自os,而不是subprocess,同样,它被称为execlp('ssh', 'ssh', host)(第二个'ssh' 在子进程中是argv[0])。
  • 感谢 john-zwinck 和 @bereal。 os.execlp 完成任务。我听说子进程比 os.system 更可取。是否有替代 os.execlp 的子进程来提供更高的安全性(相对于正在运行的任意 bash 命令)?
  • 不,子进程用于生成进程,这不是您想要的。
  • @mekarpeles 据我所知,exec* 函数从这个角度来看是完全安全的,它们只是包装了相应的系统调用。
  • @mekarpeles: subprocessfork()-ed 子进程中调用os.execvp()。这不是你想要的。
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 2017-05-29
  • 2011-08-11
  • 2011-01-31
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多