2016-06-23 132 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,它可能會幫助你。

相關問題