Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SSHTunnel w/Paramiko-CLI可以工作,但不能在脚本中工作_Python_Mysql_Ssh - Fatal编程技术网

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

Python SSHTunnel w/Paramiko-CLI可以工作,但不能在脚本中工作,python,mysql,ssh,Python,Mysql,Ssh,上下文: 我正在尝试通过SSH和Python连接到远程MySQL安装。我正在使用paramiko和SSHTunnel,目前使用的是py2.7 我使用bashshell、paramiko的forward.py甚至SSHTunnel的CLI命令成功地连接和查询了远程数据库中的记录 问题: 我在尝试将其迁移到单个脚本以创建隧道并查询结果时遇到了问题。问题似乎与我对SSHTunnel语法的格式/结构有关 这是我用来打开外壳上的通道: ssh -p SSH_PORT SSH_USER@SERVER_IP

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

我使用bashshell、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
10月9日17:36:31主机服务器sshd[21141]:从源IP端口32918 ssh2:RSA接受SSH用户的公钥
10月9日17:36:31主机服务器sshd[21141]:pam_unix(sshd:session):为用户SSH_user by(uid=0)打开的会话
10月9日17:36:31主机服务器systemd登录[1217]:用户SSH\u user的新会话144。
10月9日17:36:32主机服务器sshd[21141]:pam_unix(sshd:session):用户SSH_user的会话已关闭
使用SSHTunnel CLI时的auth.log消息(结果正常):

10月9日17:39:33主机服务器sshd[21625]:从源IP端口44132 ssh2:RSA接受SSH用户的公钥
10月9日17:39:33主机服务器sshd[21625]:pam_unix(sshd:session):为用户SSH_user by(uid=0)打开的会话
10月9日17:39:33主机服务器系统登录[1217]:已删除会话144。
10月9日17:39:33主机服务器系统登录[1217]:用户SSH\u user的新会话145。
看起来我缺少了一些基本的东西。。。任何帮助都将不胜感激。

找到了答案

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

一个简单的例子:

import time
...
sleep(1)
...
这就是诀窍

在我的例子中,我在“server.start()”之后和需要访问远程数据库的代码之前添加了sleep(1)

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

找到了答案

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

一个简单的例子:

import time
...
sleep(1)
...
这就是诀窍

在我的例子中,我在“server.start()”之后和需要访问远程数据库的代码之前添加了sleep(1)


感谢@kenster让我更仔细地查看auth.log,这让我更仔细地考虑计时问题。

“查看服务器上的var/log/auth.log…”与此相关的服务器端日志中出现了哪些实际消息?请将您的问题包括在内。谢谢Kenster。我从日志中添加了结果。唯一不同的是,在它不工作的情况下,连接会关闭。在MySQLDB连接器尝试连接到数据库之前,我无法判断是否发生了这种情况。“查看服务器上的var/log/auth.log…”服务器端日志中出现了与此相关的实际消息?请将您的问题包括在内。谢谢Kenster。我从日志中添加了结果。唯一不同的是,在它不工作的情况下,连接会关闭。我不知道在MySQLDB连接器尝试连接数据库之前是否会发生这种情况。对SEO没有什么评论。我在使用多处理库时也遇到了同样的问题。连接发生得如此之快,以至于一个端口被分配给多个隧道,因此产生了连接错误。我用你提到的方法解决了这个问题。谢谢对搜索引擎优化没有什么评论。我在使用多处理库时也遇到了同样的问题。连接发生得如此之快,以至于一个端口被分配给多个隧道,因此产生了连接错误。我用你提到的方法解决了这个问题。谢谢