Seite 1 von 1
SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 10:57
von naheliegend
Hi,
ich poste auf meinem local eine flaskwebsite und ich habe auf dem Rechner einen SSH-Zugang zu einer MySQL Datenbank.
Ich habe gegeben:
-SQL-Host = 127.0.0.1
-SQL-Username
-SQL-PW
-DB-Name
-SSH-Host
-SSH-Username
-SSH-PW
Ports müssten da 3306 und 22 sein. Trotzdem sagt mir Python:
sshtunnel.BaseSSHTunnelForwarderError
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway
Code: Alles auswählen
import pymysql
import pandas as pd
from sshtunnel import SSHTunnelForwarder
sql_hostname = 'SQL-Host'
sql_username = 'SQL Username'
sql_password = 'SSH-PW'
sql_main_database = 'DB-Name'
sql_port = 3306
ssh_host = 'SSH-Host'
ssh_user = 'SSH-Username'
ssh_passw = 'SSH-PW'
ssh_port = 22
sql_ip = '1.1.1.1.1'
with SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_password=ssh_passw,
remote_bind_address=(sql_hostname, sql_port)) as tunnel:
conn = pymysql.connect(host='127.0.0.1', user=sql_username,
passwd=sql_password, db=sql_main_database,
port=tunnel.local_bind_port)
query = '''
SELECT *
FROM BLA p
WHERE p.yes = 1234 ;'''
data = pd.read_sql_query(query, conn)
conn.close()
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 11:02
von sparrow
Wenn du auf dem selben, lokalen Rechner ein RDBMS hast - warum möchtest du dann einen SSH-Tunnel aufbauen?
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 11:12
von naheliegend
Merke gerade, dass mit 127.0.0.10 auch funktioniert als SQL-Host über HeidiSQL
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 12:24
von naheliegend
Also wenn ich die Daten in HeidiSQL oder Sequel Pro oder whatever eingebe, dann wird eine Verbindung erfolgreich aufgebaut. Im Pythoncode kommt halt der Fehler. Jetzt mit ich überfragt.
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 12:36
von Jankie
Kenne mich leider nicht gut damit aus, aber vielleicht kann ich ja trotzdem versuchen einen Beitrag zu leisten.
Kannst du vielleicht mal den gesamten Traceback posten?
Bei einigen Beispielen habe ich gesehen, dass neben remote_bind_address auch die local_bind_address mit angegeben wird, könnte es vll daran liegen? Oder evtl. an Problemen mit den RSA-Keys?
Ich habe für SSH Zgriffe bisher immer paramiko genutzt, eventuell ist da ja was dabei was dir helfen könnte.
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 12:46
von naheliegend
Traceback (most recent call last)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/PycharmProjects/flaskProject/app.py", line 24, in adder_page
result = do_calculation(number1, number2)
File "/Users/PycharmProjects/flaskProject/algorithm.py", line 20, in do_calculation
with SSHTunnelForwarder(
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1552, in __enter__
self.start()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1293, in start
self._raise(BaseSSHTunnelForwarderError,
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1100, in _raise
raise exception(reason)
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway
Wo ist denn der Unterschied zwischen dem remote_bind und local_bind?
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 12:52
von sparrow
Ich frage noch einmal: Warum willst du zu einem RDBMS, die auf dem selben lokalen Rechner läuft einen SSH-Tunnel aufbauen?
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 13:26
von naheliegend
sparrow hat geschrieben: Freitag 16. Oktober 2020, 12:52
Ich frage noch einmal: Warum willst du zu einem RDBMS, die auf dem
selben lokalen Rechner läuft einen SSH-Tunnel aufbauen?
weil ich einen VPN zu dem "lokalen Rechner" habe
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 13:31
von sparrow
Du hast ein VPN zu dem lokalen Rechner?!? Das macht nicht wirklich Sinn.
127.0.0.1 ist localhost, also der Rechner, auf dem du lokal bist. Dorthin einen SSH-Tunnel aufzubauen, ist in etwa so, als würdest du ein Paket, dass du zu deinem Nachbarn bringen möchtest, erst zu einem anderen Nachbarn bringen, der das Paket in einen anderen Karton packt und dann zu dem Nachbarn bringt, der es eigentlich haben sollte und der sich vor allem darüber ärgert, dass da jetzt 2 Kartons drum sind.
Nochmal: Deine Webanwendung und dein RDBMS laufen auf der selben Maschine? Weil das tun sie laut deinem Code. Und dann braucht es keinen SSH-Tunnel, sondern du verbindest dich direkt mit dem RDBMS.
Edit: Oh, ich sehe gerade, dass du deinen Code im Anfangspost editiert hast und nun der SSH-Hoste nicht mehr localhost ist.
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Freitag 16. Oktober 2020, 13:48
von naheliegend
Nein, VPN-Tunnel in ein entferntes Netz, in der auch die Datenbank steht. Es werden nur SHH Zugriffe auf die DB erlaubt.
Deswegen habe ich durch den VPN noch einen SSH gelegt, weil mir nichts schnelleres eingefallen ist.
Wenn ich die Daten mit HeidiSQL oder so eingebe, dann ist der DB-Zugriff erfolgreich.
Webanwendung läuft momentan auf meinem lokalen Rechner. 127.0.0.1:5000.
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Mittwoch 21. Oktober 2020, 07:29
von naheliegend
Habe es immer noch nicht geschafft. Es failed immer der SSHTunnelForwarder, aber ich verstehe nicht warum.
Wenn ich im Terminal
eingebe und im Anschluss mein
, dann läuft alles durch und die Connection wird aufgebaut.
Wenn ich aber:
Code: Alles auswählen
import sshtunnel
from sshtunnel import SSHTunnelForwarder
sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0
server = SSHTunnelForwarder(
'ip-adresse', 22,
ssh_username="user",
ssh_password="ssh-passwort",
remote_bind_address=('127.0.0.1', 3306)
)
server.start()
print(server.local_bind_port)
Bekomme ich wieder den:
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway
Warum?
Re: SHH Zugriff auf Datenbank in Flask
Verfasst: Mittwoch 21. Oktober 2020, 09:43
von sparrow
@naheliegend: Das wird dir niemand beantworten können, denn dein Code aus dem ersten Post funktioniert.
Code: Alles auswählen
from sshtunnel import SSHTunnelForwarder
ssh_host = 'der Hostname des SSH-Servers'
ssh_user = 'der SSH Benutzer'
ssh_passw = 'das Passwort des SSH Benutzers'
ssh_port = 22
remote_hostname = '127.0.0.1'
remote_port = 3306
with SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_password=ssh_passw,
remote_bind_address=(remote_hostname, remote_port)) as tunnel:
print(tunnel)
Wenn das bei dir nicht funktioniert, dann liegt das Problem nicht am Code.
Lässt die Firewall die Connection zu?
Hast du verstanden wie ein SSH-Tunnel funktioniert und sind alle Parameter für die Verbindung wirklich richtig? Inklusive Hostname des SSH-Servers?
Was passiert, wenn man die IP statt des Hostnamens des SSH Servers verwendet?
Und vielleicht musst du dich in der Dokumentation schlau machen, ob man das Logging irgendwo erhöhen kann.