首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Python子进程中调用"ssh -f -N hostname“时PID会改变,当我的程序结束时如何可靠地终止它?

为什么在Python子进程中调用"ssh -f -N hostname“时PID会改变,当我的程序结束时如何可靠地终止它?
EN

Stack Overflow用户
提问于 2020-03-16 23:54:06
回答 1查看 156关注 0票数 0

我需要通过代理连接到目标设备,以便在目标设备上执行一些命令。为此,我需要打开到代理的SSH隧道,然后使用Python库通过SSH与目标交互。该库无法容纳代理连接。当我直接使用shell打开隧道,然后使用Python库与目标交互时,这个概念就行得通了。现在我需要将shell命令移到我的Python程序中。

我尝试使用子进程打开SSH隧道,代码如下:

代码语言:javascript
复制
    config_file = "path/to/config"
    cmd = shlex.split(f"ssh -f -N jumphost-tunnel -F {config_file}")
    process = subprocess.Popen(
        cmd, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    )

这就产生了两个问题。

问题1

当我调用process.pid时,PID与我在执行ps aux | grep ssh并注意到操作系统上的PID时看到的不同。它关闭1(即:来自subprocess.pid的PID为44196,来自ps aux的PID为44197)。

我想知道为什么PID被关闭了1。这是不是因为当使用ssh -f调用时,SSH进程被放在后台

问题2

它留下了一个僵尸SSH隧道,因为我不能使用subprocess.kill()终止隧道,因为我不知道隧道命令的PID。

如何在程序完成时安全可靠地终止SSH隧道?对于一些后台,我需要通过隧道连接到代理服务器,并通过SSH在目标设备上执行命令。目标设备是Juniper SRX。我正在使用PyEZ-junos库与其交互。该库在幕后使用Paramiko与Junos设备进行交互,但是库实现没有使用OpenSSH提供的ProxyCommandProxyJump指令,因此需要调用子进程来启动到代理服务器的隧道。我不想改变PyEZ库的内部结构来解决隧道问题。

EN

回答 1

Stack Overflow用户

发布于 2020-03-17 02:33:06

我还没有检查过,但如果不是由ssh通过派生新进程并让原始进程退出而导致的ssh“后台”本身造成的,这会让我感到惊讶。

我不认为你真的需要-f标志。无论如何,subprocess.Popen都会启动一个新进程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60709170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档