python - 使用 python 3 通过 SSH(通过跳转主机)连接到 MySQL 数据库

标签 python sqlalchemy ssh-tunnel

我正在尝试在 python 和我的 MySQL 数据库(位于 AWS 中)之间建立连接。

SSH 隧道工作正常,如果随后启动与数据库的连接,就会出现问题。这是我的代码:

从 sqlalchemy 导入 create_engine 从 sshtunnel 导入 SSHTunnelForwarder

这是我的代码:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

tunnel.start()
print("SSH connection created..")   #until here it works fine.
port = str(tunnel.local_bind_port)
engine = create_engine("mysql+pymysql://db-username:db-pw@db-url"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)
connection = engine.connect()

在我尝试连接到数据库后,它显示以下错误:

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003,“无法连接到 db-url 上的 MySQL 服务器

在我创建跳转主机之前,连接字符串工作正常。

最佳答案

有了这个声明:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

在端口 22 上建立到 ssh-host 上的 ssh 服务器的 SSH 隧道,并指示远程隧道端点连接到 database-host 上运行的数据库服务器> 在端口 db-port 上(例如 3306)。但需要注意的要点是,该隧道仅在客户端建立连接后才会建立。

但是您可能会问,客户端如何建立连接? SSHTunnelForwarder 的部分功能是它监听本地主机上随机端口上的连接。因此,当您使用客户端应用程序连接到本地主机时(这就是 create_engine()engine.connect() 调用中发生的情况),SSH 隧道将从以下位置读取数据:该连接,将其推过隧道并将其传送到隧道那一侧的远程端点(即位于数据库主机:数据库端口的数据库服务器)。

因此,您的代码中缺少的是数据库连接应该以 localhost 为目标,如下所示(您应该能够使用 IP 地址 127.0.0.1 或主机名 localhost) :

engine = create_engine("mysql+pymysql://db-username:db-pw@127.0.0.1:"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)

关于python - 使用 python 3 通过 SSH(通过跳转主机)连接到 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58373690/

相关文章:

python - 多维列表 - 将整数元素 X 乘以公共(public)字符串元素 Y

python - numpy reshape()和transpose()之间有交互规则吗?

python - 在 sqlalchemy 中强制对象为 `dirty`

SSH 隧道不起作用 - 服务器响应为空

java - 使用 JSch 创建通过 SSH 隧道传输的 SOCKS 代理

python - 有没有办法将 Python sshtunnel 传递给 key 而不是文件?

python - 如何将 OBR 添加到 HL7 消息中?

python - pyspark countApprox() 似乎与 count() 没有区别

python - SqlAlchemy:将日期时间列转换为日期列

python - 将带有 jsonb_each 的 Postgresql 查询转换为 sqlalchemy