在Python中通过SSH连接MySQL数据库
我正在尝试使用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 内部设置隧道。