我需要通过代理连接到目标设备,以便在目标设备上执行一些命令。为此,我需要打开到代理的SSH隧道,然后使用Python库通过SSH与目标交互。该库无法容纳代理连接。当我直接使用shell打开隧道,然后使用Python库与目标交互时,这个概念就行得通了。现在我需要将shell命令移到我的Python程序中。
我尝试使用子进程打开SSH隧道,代码如下:
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提供的ProxyCommand或ProxyJump指令,因此需要调用子进程来启动到代理服务器的隧道。我不想改变PyEZ库的内部结构来解决隧道问题。
发布于 2020-03-17 02:33:06
我还没有检查过,但如果不是由ssh通过派生新进程并让原始进程退出而导致的ssh“后台”本身造成的,这会让我感到惊讶。
我不认为你真的需要-f标志。无论如何,subprocess.Popen都会启动一个新进程。
https://stackoverflow.com/questions/60709170
复制相似问题