【问题标题】:ssh first with mysqldb in pythonssh 首先在 python 中使用 mysqldb
【发布时间】:2012-02-22 15:36:59
【问题描述】:

我正在尝试使用 python 中的 MySQLdb 连接到远程服务器上的 MySQL 数据库。问题是首先我需要通过 SSH 连接到主机,然后从那里连接到 MySQL 服务器。不过,我遇到的问题是 MySQLdb 似乎没有办法在连接到 SQL 服务器之前建立 SSH 连接。我检查了文档,但没有任何运气。

这就是我的连接方式:

conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')

但我真正需要的是这样的:

conn = MySQLdb.connect(sshhost = 'sshhost.domain.com', sshuser = 'sshusername', sshpasswd = 'sshpasswd', host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')

这当然只是编造的。谁能给点建议?

【问题讨论】:

标签: python mysql ssh mysql-python


【解决方案1】:

我更喜欢将隧道保留在 python 代码中,我确实讨厌手动或单独创建隧道,这要归功于 sshtunnel 库,它非常易于使用。

这里有一些简单的示例,可以满足您的需求。

import MySQLdb
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
         ('sshhost.domain.com', 22),
         ssh_password="sshpasswd",
         ssh_username="sshusername",
         remote_bind_address=('mysqlhost.domain.com', 3306)) as server:

    conn = MySQLdb.connect(host='127.0.0.1',
                           port=server.local_bind_port,
                           user='user',
                           passwd='password',
                           db='dbname')

【讨论】:

  • 如果远程主机上的 mysql db 是 amazon rds,这里需要做哪些更改
  • 在 sshhost.domain.com 中,您必须使用要连接的 SSH 机器,该机器可以看到 RDS,然后将 mysqlhost.domain.com 更改为您的 rds.db.domain.com。应该这样工作。
  • 这是迄今为止解决这个问题的最佳答案。在遇到此解决方案之前,我被困了 4 天!
  • 优秀的答案!我只是想补充一点,如果您愿意,您也可以使用 pymysql 而不是 MySQLdb 进行连接。其他一切都一样 :) 谢谢,伙计!
  • 好的,对于 aws rds,我们需要使用 mysql dns(私有 dns)的配置远程绑定地址和 localhost 的 mysql 连接器主机名。我花了一段时间才注意到。谢谢
【解决方案2】:

在使用 MySQLdb.connect 之前设置 ssh 隧道。隧道会让它看起来好像你在本地运行 mysql,设置它是这样的

ssh user@host.com -L 9990:localhost:3306

这里你的本地端口 9990 将绑定到远程主机上的 3306,-L 代表本地,然后 9990:localhost:3306 表示 LOCALPORT:

conn = MySQLdb.connect(host = 'mysqlhost.domain.com:9990', user = 'user', passwd = 'password', db = 'dbname')

注意 9990。

将您的用户的公共 ssh 密钥添加到 host.com,这样您就不必在每次设置隧道时都输入密码(使用公共密钥身份验证)。

如果您需要在 python 中执行此操作,您可以从 python 中调用 python-to-ssh 绑定库来为您设置隧道。

【讨论】:

  • 谢谢。那成功了。我必须使用 127.0.0.1 而不是 localhost,以防其他人遇到类似问题。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2014-01-09
  • 2018-06-05
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多