Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中关闭ssh隧道_Python_Mysql_Ssh - Fatal编程技术网

如何在python中关闭ssh隧道

如何在python中关闭ssh隧道,python,mysql,ssh,Python,Mysql,Ssh,我正在编写一个Python应用程序,它使用ssh隧道访问远程Mysql数据库。 我用我的电脑设置了隧道 os.system("ssh -fNg -L 3306:127.0.0.1:3306 username@host") 一切都很完美。问题是: 关闭ssh隧道的python代码是什么 谢谢操作系统。系统(“退出”)不工作 创建隧道的过程仍在后台运行 >>> command = 'ssh -fNg vagrant@localhost -p2222 -L 8000:localho

我正在编写一个Python应用程序,它使用ssh隧道访问远程Mysql数据库。 我用我的电脑设置了隧道

os.system("ssh -fNg -L 3306:127.0.0.1:3306 username@host")
一切都很完美。问题是:

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

谢谢操作系统。系统(“退出”)不工作 创建隧道的过程仍在后台运行

>>> 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,因此我们可以使用它来终止进程(它返回退出代码)

使用子流程返回流程的句柄
  • 其正确的sys.exit()将不存在于脚本中,并保持隧道打开
  • 下面是我如何使用Python关闭SSH隧道,从而允许我终止 Python脚本
  • 在我的关闭函数中,我传递我创建的隧道连接:

def关闭(自身,通道=无):
如果隧道不是无:
#关闭隧道连接。
隧道关闭
  • 我使用Paramiko创建了SSH连接

def connect(参数):
#创建SSH隧道
隧道=SSHTunnelForwarder(
(params['ssh\u ip\u address'],int(params['ssh\u port']),
ssh_username=params['ssh_username'],
ssh_private_key=params['ssh_key'],
ssh_private_key_password=params['ssh_key_file_password'],
远程绑定地址=('localhost',int(参数['ssh\u远程转发端口]),
本地绑定地址=('localhost',int(params['ssh\u local\u forward\u port']))
隧道开始
回程隧道

您是否尝试过操作系统(“退出”)?您可以尝试使用paramiko并使用此:.os.system(“退出”)这就是我想要的,谢谢。我也会看看Paramiko。这并不容易,因为你把隧道放在了后台。关于如何在脚本中处理这个问题的讨论在上。系统管理方法是确定如何在ps输出中识别隧道进程,从中可以确定其PID并用来杀死它。试试看
import subprocess
proc = subprocess.Popen(command, shell=True)
proc.terminate() # this terminates the process