在Paramiko中以编程方式关闭SSH隧道

3 投票
1 回答
2595 浏览
提问于 2025-04-15 22:24

我们正在尝试使用paramiko模块来按需创建SSH隧道,以便连接到任意服务器,主要是为了查询远程数据库。我们试过使用paramiko自带的forward.py示例,但遇到一个大问题,就是一旦启动了socket服务器,似乎没有简单的方法来关闭SSH隧道和SSH连接。

我们的限制是,不能从命令行启动这个程序,然后手动结束命令行来停止监听。我们需要在Python中打开SSH连接、建立隧道、通过隧道执行一些操作,然后关闭隧道和SSH连接。

我看到有人提到过server.shutdown()这个方法,但不太清楚怎么正确使用它。

1 个回答

5

我不太明白你说的“正确实现”是什么意思——你只需要跟踪服务器对象,并在需要的时候调用 shutdown 方法就可以了。在 forward.py 文件中,服务器对象没有被跟踪,因为 forward_tunnel 函数的最后一行是

ForwardServer(('', local_port), SubHander).serve_forever()

这样一来,服务器对象就不容易被访问到了。不过你可以把它改成,比如:

global theserver
theserver = ForwardServer(('', local_port), SubHander)
theserver.serve_forever()

然后在一个单独的线程中运行 forward_tunnel 函数,这样 main 函数就可以重新获得控制权(而 serve_forever 在那个单独的线程中运行),并且可以在合适的时候调用 theserver.shutdown()

撰写回答