2016-06-23 131 views
2

我想在python中通过ssh连接到mysql数据库,但出现错误。我有以下保存在一个python文件'forward.py'中。我的代码如下:使用SSHTunnelForwarder通过SSH连接到MySQL数据库

forward.py

from sshtunnel import SSHTunnelForwarder 
import MySQLdb 

with SSHTunnelForwarder(
     ('ssh_host', 22), 
     ssh_password="ssh_password", 
     ssh_username="ssh_username", 
     remote_bind_address=('mysql_host', 3306)) as server: 

    con = MySQLdb.connect(user='mysql_username',passwd='mysql_password',db='mysql_db_name',host='mysql_host',port=server.local_bind_port) 

当我在终端运行forward.py,收到以下错误:

_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on  
'mysql_host' (60)") 

值得注意的是,的值是硬编码值的安全性,即'mysql_host'是一个真正的主机,我可以ssh很好,当我运行时

ssh mysql_host 

通过终端。我也可以使用Sequel Pro以相同的值进行连接,具体取决于:http://screencast.com/t/0niuWlMDb

任何人都可以指向正确的方向吗?在此先感谢

回答

0

我认为你的问题在于,你正在创建一个本地SSH通道,但试图直接连接到远程主机,这违背了使用SSH隧道的目的。

我相信如果您将连接字符串从host='mysql_host'更改为host='127.0.0.1'您将解决您的问题。

如果您查看Sequel Pro实例的调试/连接设置,您将看到正在使用的实际连接命令,并且应该有希望证实情况是如此。对SSH转发

进一步的参考材料: http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html

0

如果您使用SSH隧道转发您需要连接到“本地主机:3306”,而不是你的实际“的MySQL主机:3306”。

让我解释发生了什么:

  1. 您建立与SSH到远程MySQL主机
  2. 你的客户端安装隧道连接和监听TCP:3306你的本地主机上:本地主机:3306
  3. 任何到localhost:3306的流量都将通过SSH隧道透明地重定向到mysql_host:3306。

尝试在您的配置中使用'localhost:3306'。 几个例子看看here,它可能会帮助你。

相关问题