如何关闭通过Popen在Python中打开的ssh隧道

1 投票
1 回答
2254 浏览
提问于 2025-04-16 19:16

我需要创建一个SSH隧道,然后做一些事情,最后再关闭这个隧道。

我尝试这样做:

def runCmd(self,cmd):
    args = shlex.split(cmd)
    return subprocess.Popen(args)

def openTunnel
    cmd = 'ssh -f -N -L 1313:localhost:1313 userid@server.com'
    self.TunnelObj = self.runCmd(cmd)

这段代码创建了我的隧道。接下来,我可以进行我需要做的事情。现在我想关闭这个隧道。

    def closeSocket(self):
        print '\nClosing Tunnel\n'
        if self.TunnelObj.returncode == None: 
            print '\nabout to kill\n'
            self.TunnelObj.kill()

但是隧道仍然是打开的。SSH会话还在,端口也还在使用中。

我该怎么关闭这个隧道呢?

1 个回答

2

问题的一部分在于,隧道进程是self.TunnelObj的一个子进程。你可以试着去掉-f这个标志,这样你就可以直接控制隧道进程。

另一个选择是看看paramiko这个库,以及这个问题。

撰写回答