在Paramiko中以编程方式关闭SSH隧道
我们正在尝试使用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()
。