2016-06-23 10 views
2

私はPythonでsshを介してmysql dbに接続しようとしていますが、エラーが発生しています。私は以下をpythonファイル 'forward.py'に保存しました。私のコードは次のとおりです。SSHunnelForwarderを使用して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フォワーディングのさらなる参考資料:代わりに、実際の「MySQLのホスト:3306」は: http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html

0

あなたが「3306 localhostの」に接続する必要が転送SSHトンネルを使用している場合。

何が起こったのか私に説明してみましょう:

  1. あなたは、リモートのMySQLホスト
  2. あなたのクライアントのセットアップトンネルへのSSH接続を確立し、TCPのために聞く:あなたのローカルホスト上の3306:localhostを:3306
  3. localhost:3306へのトラフィックはすべて、SSHトンネル経由で透過的にmysql_host:3306にリダイレクトされます。

あなたの設定で 'localhost:3306'を使ってみてください。 少しの例ではhereを見てください、それもあなたを助けるかもしれません。

関連する問題