2017-03-10 2 views
2

Ich benutze Python 3.5, pymysql 0.7.6 auf MacOS X 10.12.Verbindung zu MySQL in einem Remote-Server von Python

Ich versuche mit Python auf eine MySQL-Datenbank in einem Remote-Server zuzugreifen. Ich habe keine Probleme in der Befehlszeile für den Zugriff mit:

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

und dann in dem Server:

mysql my_database -p 
Enter password: my_database_password 

Und es funktioniert und ich kann alle Art von Sachen mit meiner Datenbank tun. Nun versuche ich in Python das gleiche zu tun, im Anschluss an die Dokumentation oder die zahlreichen Beispiele, die ich in anderen Beiträgen hier gefunden habe:

import pymysql 

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

Und es funktioniert nicht, als Störung zu erhalten:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' ([Errno 61] Connection refused)") 

Die Anmeldeinformationen sind die richtigen Anmeldeinformationen und ich habe überprüft, dass der Port der richtige Port ist, wie es in anderen Posts vorgeschlagen wird. Ich vermute, dass es mit der Datenbank verbunden sein könnte, die auch ein Passwort hat, nicht nur den Server, aber ich habe keine Möglichkeit gefunden, beide Passwörter aufzunehmen. In der Tat bin ich nicht sicher, welches Passwort in den connect-Befehl aufgenommen werden sollte, ob das Server-Passwort oder das Datenbank-Passwort. Es funktioniert nicht mit keinem von ihnen.

Also, haben Sie irgendwelche Vorschläge, was könnte das Problem hier sein oder wenn ich ein wichtiges Bit fehlt?

Antwort

1

Wenn Sie den Befehl mysql ausführen, tun Sie dies in einer SSH-Shell. Das heißt, Sie stellen eine Verbindung mit dem Server her, der auf dem Remotecomputer über eine localhost-Verbindung ausgeführt wird. Dieser Remote-Server scheint nicht eingerichtet zu sein, um Remote-Verbindungen zu ihm zuzulassen, sondern nur Verbindungen von der Maschine selbst.

Sie müssen Ihr Python-Skript auf die gleiche Weise wie SSH mit dem MySQL-Server verbinden. Sie können einen SSH-Tunnel zu Port 3306 auf dem Remote-Server öffnen.

Das Modul I für diesen Zweck verwenden möchte, ist: 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

Vielen Dank! Diese Lösung funktionierte wie ein Zauber. Sehr klare Erklärung auch. – dalonsoa

1

auf der gegebenen Informationen Aufgrund würde ich vorschlagen, Sie versuchen, die folgenden:

  1. die bind-Adresse MySQL Stellen Sie sicher ist "0.0.0.0". Sie können dies tun, indem Sie /etc/mysql/my.cnf bearbeiten und überprüfen, ob die Option bind-address auf "0.0.0.0" gesetzt ist.

  2. Stellen Sie sicher, dass der Port von Ihrem Remote-Computer geöffnet ist. Installieren Sie "nmap" und verwenden Sie dann nmap -sS -O -p3306 <public-server-ip>. Wenn etwas so aussieht wie 3306/mysql open alles gut. Wenn nicht, müssen Sie sicherstellen, dass Ihre Firewall diesen Port nicht blockiert.

als Raketen Hazmat schlägt Sie wahrscheinlich wollen einen SSH-Tunnel verwenden, um zur Verringerung der Risiken des Aussetzens MySQL-Port direkt als Daten wahrscheinlich im Klartext gesendet wird. Wenn Sie Ihren Code nur lokal testen müssen, bevor Sie ihn auf dem Server bereitstellen, können Sie den folgenden Befehl verwenden, bevor Sie Ihren Python-Code ausführen: ssh -f [email protected] -L 3306:127.0.0.1:3306 -N. In diesem Fall müssen Sie Schritt eins und zwei nicht abschließen.

Verwandte Themen