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

时间:2019-10-14 09:21:21

标签: 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服务器

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

1 个答案:

答案 0 :(得分:0)

使用以下语句:

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的部分功能是它侦听本地主机上随机端口上的连接。因此,当您使用客户端应用程序连接到localhost时(这就是 create_engine() engine.connect()调用中发生的情况),SSH隧道将从其中读取数据该连接,将其推过隧道,然后将其传递到隧道那侧的远程端点(即,位于database-host:db-port的数据库服务器)。

因此,您在代码中缺少的是数据库连接应以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)