上下文:
我正在尝试通过SSH和Python连接到远程MySQL安装。我正在使用paramiko和SSHTunnel,目前在py 2.7上。
我已经成功地使用bash shell,paramiko的forward.py甚至SSHTunnel的CLI命令连接和查询了远程数据库中的记录。
问题:
尝试将其迁移到将创建隧道并查询结果的单个脚本时遇到问题。问题似乎与我对SSHTunnel语法的格式设置/结构有关。
这是我用来在外壳上打开隧道的方法:
ssh -p SSH_PORT SSH_USER@SERVER_IP -L 33060:127.0.0.1:3306
这就是我用paramiko的forward.py打开的内容:
python t_forward.py SERVER_IP:SSH_PORT -r 3306 -u SSH_USER -p 33060 -K "/PATH/TO/PRIVATE/KEY"
注意:我目前正在使用没有密码的密钥(用于测试/开发目的)
这是我以前用SSHTunnel的命令行打开的内容:
python -m sshtunnel -U SSH_USER -L :33060 -R 127.0.0.1:3306 -p SSH_PORT SERVER_IP -K "/PATH/TO/PRIVATE/KEY"
按照以上所述,所有这些都可以正常工作,而使用MySQLdb连接到数据库并检索记录的py脚本也可以正常工作。
发生故障的地方是我尝试将SSH连接字符串添加到脚本中的时候。这是当前的样子:
server = SSHTunnelForwarder(
('SERVER_IP', SSH_PORT),
ssh_username='SSH_USER',
ssh_pkey='/PATH/TO/PRIVATE/KEY',
remote_bind_address=('127.0.0.1', 3306),
local_bind_address=('0.0.0.0', 33060)
)
MYSQL连接线如下所示:
con = MySQLdb.connect(user='MYSQLDBUSER',passwd='MYSQLDBUSERPASS',db='DATABASE',host='127.0.0.1', port=33060)
鉴于我能够通过BASH以及通过forward.py和SSHTunnel的CLI进行连接,这在服务器上似乎不是问题,但我的SSHTunnelForwarder格式不正确。
错误信息:
Could not establish connection from ('127.0.0.1', 33060) to remote side of the tunnel
查看服务器上的var / log / auth.log,我发现它可以连接,当MySQLDB.connect启动时,它似乎崩溃了。
出现此错误时出现auth.log消息:
Oct 9 17:36:31 HOSTSERVER sshd[21141]: Accepted publickey for SSH_USER from SOURCE_IP port 32918 ssh2: RSA <LONG KEY>
Oct 9 17:36:31 HOSTSERVER sshd[21141]: pam_unix(sshd:session): session opened for user SSH_USER by (uid=0)
Oct 9 17:36:31 HOSTSERVER systemd-logind[1217]: New session 144 of user SSH_USER.
Oct 9 17:36:32 HOSTSERVER sshd[21141]: pam_unix(sshd:session): session closed for user SSH_USER
使用SSHTunnel CLI时的auth.log消息(结果有效):
Oct 9 17:39:33 HOSTSERVER sshd[21625]: Accepted publickey for SSH_USER from SOURCE_IP port 44132 ssh2: RSA <LONG KEY>
Oct 9 17:39:33 HOSTSERVER sshd[21625]: pam_unix(sshd:session): session opened for user SSH_USER by (uid=0)
Oct 9 17:39:33 HOSTSERVER systemd-logind[1217]: Removed session 144.
Oct 9 17:39:33 HOSTSERVER systemd-logind[1217]: New session 145 of user SSH_USER.
似乎我在这里缺少了一些非常基本的东西。任何帮助将不胜感激。
找到了答案!
事实证明,在建立连接之前,脚本会继续执行。因此,MySQLDB会在完全建立隧道之前尝试连接到端口映射。
一个简单的:
import time
...
sleep(1)
...
绝招。
就我而言,我在“ server.start()”之后和需要访问远程数据库的代码之前添加了sleep(1)。
感谢@kenster,他让我更加仔细地查看auth.log,这使我可以更加仔细地考虑计时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句