运行 在连接到 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
我正在编写一个 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