在Python中通过SSH连接MySQL数据库

5 投票
2 回答
10532 浏览
提问于 2025-04-17 11: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')

当然,这只是我随便编的。有没有人能给点建议?

2 个回答

20

我更喜欢把隧道设置放在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')
9

在使用 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。

把你的用户的公钥添加到 host.com,这样你每次设置隧道的时候就不用输入密码了(使用公钥认证)。

如果你想在 Python 中做这个,有一些 Python 的库可以帮助你从 Python 内部设置隧道。

撰写回答