如何关闭python中的ssh隧道

时间:2015-07-11 07:50:01

标签: python mysql ssh

我正在编写一个使用ssh隧道访问远程Mysql数据库的Python应用程序。 我用

设置了隧道
os.system("ssh -fNg -L 3306:127.0.0.1:3306 username@host")

一切都很完美。问题是:

关闭ssh隧道的python代码是什么?

由于

2 个答案:

答案 0 :(得分:3)

os.system('exit')不起作用

创建隧道的过程仍然在后台运行

>>> command = 'ssh -fNg vagrant@localhost -p2222 -L 8000:localhost:8000'
>>> os.system(command)
>>> os.system('exit')

ps -A | grep ssh
7144 ??         0:00.04 ssh -fNg vagrant@localhost -p2222 -L 8000:localhost:8000

这表明进程仍在运行且隧道仍在工作,os.system不返回进程ID,因此我们可以使用它来终止进程(它返回退出代码)

使用子流程返回流程的句柄

import subprocess
proc = subprocess.Popen(command, shell=True)
proc.terminate() # this terminates the process

答案 1 :(得分:0)

  • 它正确的sys.exit()脚本不存在,并且可以保持隧道打开。
  • 这是我使用Python关闭SSH隧道的方法,从而使我可以终止 Python脚本。
  • 在我的关闭函数中,我传递了我创建的隧道连接:
def close(self, tunnel = None): if tunnel is not None: # close tunnel connection. tunnel.close()
  • 我使用Paramiko创建了SSH连接
def connect(params): # Create an SSH tunnel tunnel = SSHTunnelForwarder( (params['ssh_ip_address'], int(params['ssh_port'])), ssh_username=params['ssh_username'], ssh_private_key=params['ssh_key'], ssh_private_key_password=params['ssh_key_file_password'], remote_bind_address=('localhost', int(params['ssh_remote_forward_port'])), local_bind_address=('localhost',int(params['ssh_local_forward_port'])) tunnel.start() return tunnel