![](/img/trans.png)
[英]python subprocess.Popen and ssh port forwarding in the background
[英]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
参数,以便它在创建隧道后立即返回: 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.