Python SSHTunnel w / Paramiko - CLI可以工作,但不能在脚本中工作

时间:2016-10-09 15:28:54

标签: python mysql ssh

上下文:
我正在尝试通过SSH和Python连接到远程MySQL安装。我正在使用paramiko和SSHTunnel,目前在py 2.7上。

我已经成功使用bash shell,paramiko的forward.py,甚至是SSHTunnel的CLI命令连接和查询远程数据库中的记录。

问题:
尝试将其迁移到将创建隧道的单个脚本并查询结果时,我遇到了问题。问题似乎在于我对SSHTunnel语法的格式化/结构化。

这是我用来在shell上打开隧道的方法:

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"

在上面,所有这些都有效,我的py脚本使用MySQLdb连接到数据库并检索记录。

当事情发生时,我尝试将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.

似乎我在这里遗漏了一些非常基本的东西......任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

找到了答案!

事实证明,脚本在建立连接之前继续执行。因此,MySQLDB会在隧道完全建立之前尝试连接到端口映射。

简单:

import time
...
sleep(1)
...

诀窍。

就我而言,我在&#34; server.start()&#34;之后添加了sleep(1)。在需要访问远程数据库的代码之前。

感谢@kenster让我更仔细地查看了auth.log,让我更仔细地考虑时间安排。