2017-03-10 23 views
2

私はMacOS X 10.12でPython 3.5、pymysql 0.7.6を使用しています。PythonからリモートサーバーでMySQLに接続

私はPythonを使用してリモートサーバーのMySQLデータベースにアクセスしようとしています。サーバ内の

ssh [email protected] 
[email protected]'s password: my_server_password 

、その後:私は使用してコマンドラインからアクセスするための問題を抱えていない

mysql my_database -p 
Enter password: my_database_password 

をそして、それは動作し、私は私のデータベースで物事のすべての並べ替えを行うことができます。

import pymysql 

cnx = pymysql.connect(host='XXX.XXX.XXX.XXX', port='3306', user='root', password='my_server_password', db='my_database') 

そして、それはエラーとなって、動作しません:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' ([Errno 61] Connection refused)") 
今、私はマニュアルまたは私はここの他の記事で見てきた数多くの例以下、パイソン内で同じことをしよう

資格情報が正しい資格情報であり、私はポートが正しいポートであることを確認しました。これは他のポストで提案されているとおりです。私はそれがパスワードだけでなく、データベースを持っているかもしれないと思うが、私は両方のパスワードを含める方法を見つけていない。実際には、サーバーパスワードまたはデータベースパスワードの場合、どのパスワードをconnectコマンドに含めるべきかわかりません。それはそれらのどちらにも作用しません。

ここに問題があるかどうか、または重要なビットが見つからない場合はどうすればよいですか?

答えて

1

mysqlコマンドを実行すると、これはSSHシェルで実行されます。つまり、localhost接続経由でリモートマシン上で実行されているサーバーに接続しています。そのリモートサーバーはリモート接続を許可するように設定されていないようで、マシン自体からの接続のみです。

SSH経由でPythonスクリプトをMySQLサーバに接続する必要があります。リモートサーバー上のポート3306へのSSHトンネルを開くことができます。

私は、この目的のために使用したいモジュールがある:与えられた情報に基づいてhttps://pypi.python.org/pypi/sshtunnel

from sshtunnel import SSHTunnelForwarder 
import pymysql 

server = SSHTunnelForwarder(
    'XXX.XXX.XXX.XXX', 
    ssh_username='root', 
    ssh_password='my_server_password', 
    remote_bind_address=('127.0.0.1', 3306) 
) 
server.start() 

cnx = pymysql.connect(
    host='127.0.0.1', 
    port=server.local_bind_port, 
    user='root', 
    password='my_database_password', 
    db='my_database' 
) 

# Make sure to call server.stop() when you want to disconnect 
# after calling cnx.close() 
+0

ありがとうございます!このソリューションは、魅力的に機能しました。非常に明確な説明も。 – dalonsoa

1

、私はあなたが次のことを試してくださいお勧めします:

  1. のMySQLバインドアドレスがあることを確認"0.0.0.0"。 /etc/mysql/my.cnfを編集し、bind-addressオプションが「0.0.0.0」に設定されていることを確認してください。

  2. リモートマシンからポートが開いていることを確認してください。 "nmap"をインストールしてnmap -sS -O -p3306 <public-server-ip>を使用してください。 3306/mysql openのようなものをすべて表示してください。そうでない場合は、ファイアウォールがそのポートをブロックしていないことを確認する必要があります。ロケット危険物として

あなたはおそらく、データがおそらく平文で送信されるように直接、MySQLのポートを露出させるリスクを軽減するためにSSHトンネルを使用したいと思うでしょう示唆しています。サーバーにデプロイする前にコードをローカルでテストするだけであれば、Pythonコードを実行する前に次のコマンドを使用できます:ssh -f [email protected] -L 3306:127.0.0.1:3306 -N。この場合、ステップ1と2を完了する必要はありません。

関連する問題