gpt4 book ai didi

带有 Paramiko 的 Python SSHTunnel - CLI 有效,但在脚本中无效

转载 作者:行者123 更新时间:2023-11-29 04:16:57 28 4
gpt4 key购买 nike

上下文:
我正在尝试通过 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"

注意:我目前使用的是没有密码的 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,这让我更仔细地考虑时间安排。

关于带有 Paramiko 的 Python SSHTunnel - CLI 有效,但在脚本中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39945269/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com