2015-05-12 220 views
4

我想通过SSH将我的python程序连接到远程MySQL数据库。通过SSH连接到MySQL数据库

我使用Paramiko进行SSH和SQLAlchemy。

这是我到目前为止有:

import paramiko 
from sqlalchemy import create_engine 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('host', port=port, username='user', password='pass') 

engine = create_engine('mysql+mysqldb://user:[email protected]/db') 

我得到一个错误:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2003, "Can't connect to MySQL server on 'mcsdev.croft-it.com' (60)") 
+0

如果服务器通过主机名是已经上市,为什么不从远程自身授予对数据库的访问?似乎有点多余通过SSH连接,然后到MySQL服务器 – fechnert

+0

因为该程序将分发到许多不同的网站,我们不知道IP。我可以添加一个通配符,但我不认为这会是理想的 – Mantis

+0

但是,如果在该应用程序运行的每个服务器上都有一个公共ip地址(对于ssh部分),则可以连接到数据库本身。 – fechnert

回答

7

对不起我之前发布了重复的答案。这是一个更详细的答案,为您的问题量身定做;)

如果您仍然需要通过SSH连接到远程MySQL数据库我已经使用了一个名为sshtunnel的库,它包装并简化了paramiko(依赖项sshtunnel)。

有了这个代码,我想你会好到哪里去:

from sshtunnel import SSHTunnelForwarder 
from sqlalchemy import create_engine 

server = SSHTunnelForwarder(
    ('host', 22), 
    ssh_password="password", 
    ssh_username="username", 
    remote_bind_address=('127.0.0.1', 3306)) 

engine = create_engine('mysql+mysqldb://user:[email protected]:%s/db' % server.local_bind_port) 

# DO YOUR THINGS 

server.stop() 
+0

我们是否需要手动处理连接和关闭连接,如果我将它与Flask一起使用? –