运行 在连接到 mySql 服务器之前在后台进行 ssh 端口转发

Run ssh port forwarding in background before connecting to mySql server

我正在编写一个 python 脚本,它将打开一个 ssh 连接来进行端口转发,如下所示:

import pexpect
import sqlalchemy as sql

child = pexpect.spawnu('ssh -L 3306:remote.db.host:3306 username@hostname')
child.expect (u'password:')
child.sendline ('xxxxxxxx')

while child.isalive():
    try:
        engine = sql.create_engine('mysql+pymysql://ro:xxxx@127.0.0.1:3306/testdb')
        connection = engine.connect()
        #run queries 
        connection.close()
        break
    finally:
        child.close()

这个脚本吐出这个错误,我不知道该怎么办。

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 61] Connection refused)")

如果我在child.sendline(..)之后使用'child.interact()',我最终会登录到转发服务器。但我真正想要的是继续 运行 一个 sql 查询从远程数据库获取数据 本地主机端口 3306。

那么,如何在后台建立到 运行 的 ssh 连接?在连接到 mysql 服务器之前,我需要确保已建立连接。

你快到了。 尝试在 ssh 命令中使用 -N 参数,以便在创建隧道后立即 returns:ssh -LN 3306:remote.db.host:3306 username@hostname.

我也会使用 ssh 密钥(可能没有密码或使用某种密钥环),这样您就不必使用 pexpect。

尝试创建一个 bash 脚本来创建隧道和 运行 python 脚本,如下所示:

#!/bin/bash

ssh -LN 3306:remote.db.host:3306 username@hostname
python your_script_name