在前台生成子进程,即使在python退出之后

在前台生成子进程,即使在python退出之后,python,bash,ssh,subprocess,fork,Python,Bash,Ssh,Subprocess,Fork,假设存在一个python脚本resolve_ip.py,它神奇地返回我们关心的机器的字符串ip 我有兴趣学习如何实现与以下bash命令相当的python: user@host:~$ ssh $(./resolve_ip.py) 在这个bash示例中,python脚本运行后,它将被替换或替换为返回值,返回值反过来作为ssh程序的输入提供。结果是,python程序终止,用户与ssh初始化交互 问题是,此解决方案需要使用2个脚本(一个bash脚本来运行ssh,与python脚本结合来返回参数)或者人

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

我有兴趣学习如何实现与以下bash命令相当的python:

user@host:~$ ssh $(./resolve_ip.py)
在这个bash示例中,python脚本运行后,它将被替换或替换为返回值,返回值反过来作为ssh程序的输入提供。结果是,python程序终止,用户与ssh初始化交互

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

问题:

是否有一种方法,仅使用python,通过使用子进程或类似模块来启动/分叉交互式服务(如ssh),并使分叉的子进程在前台保持活动状态,即使在其父进程(python)具有sys.exit()d之后也是如此

考虑事项:

在本例中,这个问题的重点不是在Python中编写ssh凭据提交到ssh的脚本。这是如何生成一个子流程,该子流程在其父/生成程序终止后继续运行

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

我想你是想这么做的。像这样:

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一样,解释器将不再执行。

我想您希望执行“”。像这样:

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一样,解释器将不再执行。

ssh运行后是否需要Python执行任何操作?ssh运行后是否需要Python执行任何操作?
execlp
来自
os
,而不是
子进程
,而且它的名称类似于
execlp('ssh',ssh',host)
(第二个
'ssh'
是子进程中的
argv[0]
)。感谢john zwinck和@bereal.os.execlp完成了这项任务。我听说子进程比os.system更可取。是否有子进程替代os.execlp提供更高的安全性(对于正在运行的任意bash命令)?不,子进程用于生成进程,这不是您想要的。@mekarples据我所知,
exec*
函数从这个角度来看是完全安全的,它们只包装相应的系统调用。@mekarples:
subprocess
调用
os.execvp()
fork()中
-ed子进程。它不是您想要的。
execlp
来自
os
,而不是
子进程
,而且它被称为像
execlp('ssh','ssh',host)
(第二个
'ssh'
是子进程中的
argv[0]
)。谢谢john zwinck&@bereal.os.execlp完成了任务。我听说子流程比os.system更可取。是否有子流程替代os.execlp,以提供更高的安全性(针对正在运行的任意bash命令)?不,子进程用于生成进程,这不是您想要的。@mekarples据我所知,
exec*
函数从这个角度来看是完全安全的,它们只包装相应的系统调用。@mekarples:
subprocess
调用
os.execvp()
fork()中
-ed子进程。这不是您想要的。