MySQL Datenbank verbindung über SSH

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    MySQL Datenbank verbindung über SSH

    Hallo !

    Ich möchte auf meine Mysql Datenbank Zugreifen, daran bin ich jedoch gescheitert.
    Nach längerer suche habe ich herausgefunden das bei meinem Anbieter der remotezugriff gesperrt ist.

    Nun habe ich auf der suche nach einer Lösung diesen Thread Gefunden: MySQL Connection over SSH

    Zum Testen habe ich den Code Kopiert. (Ich kopiere gern Code und verändere ihn ,bis ich ihn so weit verstanden habe sodass ich damit arbeiten kann. Meine art zu Lernen ;) )
    Er Funktioniert aber noch nicht.

    Der Fehler Tritt in Zeile 40 auf.

    Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Imports Renci
    3. Public Class Form1
    4. Public Shared uconnection As New MySql.Data.MySqlClient.MySqlConnection
    5. Public Shared dat As Common.DataAdapter
    6. Public Shared DB_SSH_SERVER As String
    7. Public Shared DB_SSH_USER As String
    8. Public Shared DB_SSH_PASSWORD As String
    9. Public Shared DB_MYSQL_SERVER As String
    10. Public Shared DB_MYSQL_DATABASE As String
    11. Public Shared DB_MYSQL_USER As String
    12. Public Shared DB_MYSQL_PASSWORD As String
    13. Public Shared BASE_NAME As String
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. DB_SSH_SERVER = "*****"
    16. DB_SSH_USER = "*****"
    17. DB_SSH_PASSWORD = "*****"
    18. DB_MYSQL_SERVER ="*****"
    19. DB_MYSQL_DATABASE ="*****"
    20. DB_MYSQL_USER = "*****"
    21. DB_MYSQL_PASSWORD = "*****"
    22. BASE_NAME = "*****"
    23. End Sub
    24. Public Sub openConnection()
    25. Dim connInfo As New Renci.SshNet.PasswordConnectionInfo(DB_SSH_SERVER, DB_SSH_USER, DB_SSH_PASSWORD)
    26. 'Using
    27. Dim sshClient As New Renci.SshNet.SshClient(connInfo)
    28. sshClient.Connect()
    29. If sshClient.IsConnected Then
    30. Dim port As New Renci.SshNet.ForwardedPortLocal(DB_MYSQL_SERVER, 3306, DB_MYSQL_SERVER, 3306)
    31. sshClient.AddForwardedPort(port)
    32. port.Start()
    33. MsgBox("ssh tunnle opened")
    34. Dim strConnStr As String
    35. uconnection = New MySqlConnection
    36. strConnStr = "Server=" & DB_MYSQL_SERVER
    37. strConnStr &= ";Database=" & DB_MYSQL_DATABASE
    38. strConnStr &= ";UserID=" & DB_MYSQL_USER
    39. strConnStr &= ";Password=" & DB_MYSQL_PASSWORD
    40. uconnection.ConnectionString = strConnStr
    41. Try
    42. uconnection.Open()
    43. Catch exOpenConnection As Exception
    44. MsgBox("error open connection" & exOpenConnection.Message, MsgBoxStyle.Information, BASE_NAME)
    45. End Try
    46. End If
    47. ' End Using
    48. MsgBox("mysql connection opened")
    49. sub_end:
    50. End Sub


    Fehler:

    Quellcode

    1. System.Net.Sockets.SocketException wurde nicht behandelt.
    2. ErrorCode=10049
    3. HResult=-2147467259
    4. Message=Die angeforderte Adresse ist in diesem Kontext ungültig
    5. NativeErrorCode=10049
    6. InnerException:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VBob“ ()

    Wenn man die Fehlermeldung genau liest, beschleicht einen der Gedanke, dass die angeforderte Addresse in diesem Kontext vlt nicht gültig sei.
    Mehr kann ich dazu nicht sagen, denn ich kenne die angeforderte Addresse nicht - ich sehe ja nicht deine Angaben.
    Vermutlich hat der Original-Author Angaben gemacht, die in seinem Kontext gültig sind, und du machst Angaben, die es in deinem Kontext nicht sind.
    Frag ihn doch einfach, was man dabei beachten muss, um gültige Angaben machen zu können.
    Ich habe ihn schon Angeschrieben :)
    Ich hoffe dass er meine Frage bald bekommen wird.

    Die Daten habe ich von der Strato webseite:

    Quellcode

    1. DB_SSH_SERVER = "ssh.strato.de"
    2. DB_SSH_USER = "meinedomain.de"
    3. DB_SSH_PASSWORD = "passwort"
    4. DB_MYSQL_SERVER = "rdbms.strato.de"
    5. DB_MYSQL_DATABASE = "datenbank"
    6. DB_MYSQL_USER = "benutzer"
    7. DB_MYSQL_PASSWORD = "passwort"
    8. BASE_NAME = "mein datentable"


    Habe die Daten schon mit Putty ausprobiert.
    Das hat auch geklappt:

    Leider Steh ich auf dem Schlauch.

    port.Start() müsste ja mit Dim port As New Renci.SshNet.ForwardedPortLocal(DB_MYSQL_SERVER, 3306, DB_MYSQL_SERVER, 3306) zusammenhängen.
    Jedoch weiß ich nicht was ich dort sonst eintragen sollte.
    Nur mal so gefragt: Kannst du überhaupt, grundsätzlich per SSH auf den MySQL Server zugreifen?
    Versuch mal über Putty auf den Server zu zugreifen. Sollte dies auch fehlschlagen, kannst du davon ausgehen, dass der Anbieter einfach ned will, dass in irgendeiner weise per SSH drauf zugreift.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Habe die Daten schon mit Putty ausprobiert.
    Das hat auch geklappt:

    Mit Putty funktioniert es.

    Jedoch gibt mir Visual Basic den oben genannten Adressfehler aus :(
    Ich verstehe nicht warum.

    Frank Neumann schrieb:

    kann nur mit der Putty mich auf den mysql verbinden
    Putty verbindet auf den SSH-Port.
    Dort kannst du den MySql-Manager aufrufen, um die Datenbank zu verwalten.
    Eine direkte Verbindung von deiner Anwendung auf Port 3306 lässt Strato vermutlich gar nicht zu.
    Meistens ist MySql nur von "innerhalb" deiner Strato-Umgebung freigeschaltet.
    Also zum Beispiel von deiner Strato-Webseite.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mit PuTTY stellst du eine Verbindung zu ssh.strato.de und von dort aus kannst du auf den SQL Server zugreifen, von außen direkt aber nicht.
    Ja: dein pc <-> ssh.stato.de <-> sql-server
    Nein: dein pc <-> sql-server
    Doch die Antwort ist richtig, mit "renci" meinst du wohl "SSH.NET"? Damit baust du wie mit PuTTY eine SSH Verbindung auf und tunnelst deine SQL Verbindung da durch.
    Das entspricht dann "dein pc <-> ssh.strato.de <-> sql-server".
    Kannst du, PuTTY ist auch nur ein Client der u.a. SSH kann, wenn du also in deine Anwendung ein SSH Client integrierst und darüber dein SQL Verbindung tunnelst funktioniert das, aber du kannst nicht direkt von deinem PC zu dem SQL Server eine Verbindung herstellen, du musst dafür wie schon erwähnt die Verbindung durch den SSH Tunnel schicken.
    "funktioniert es nicht" ist keine Fehlerbeschreibung.
    Vermutlich wird deine SQL Verbindung nicht durch den Tunnel geschickt und deswegen klappt es nicht, aber das ist nur geraten.
    Das Thema wurde hier sehr oft diskutiert und eine Lösung wurde nie gefunden. Jetzt willst du hier sagen, es liegt daran, daß nur eine lächerliche SQL Verbindung durch den SSH nicht hergestellt wurde?

    Dann zeige doch bitte ein Code Beispiel was tatsächlich auch bei Strato funktioniert.

    Danke im Voraus
    Frank
    Wenn du eine Remoteverbindung zu ssh.strato.de herstellst und von dem Server aus eine Verbindung zum SQL-Server herstellen kannst, dann ja.
    Dafür musst du in deiner Anwendung eine SSH-Session öffnen, ein port forwarding erstellen und dann deine SQL-Verbindung da durch tunneln.

    Das kannst du auch selbst testen in dem du in PuTTY ein Forwarding konfigurierst (zb. localhost:3306 -> rdbms.strato.de:3306) und dann in deiner Anwendung für die SQL-Verbindung "localhost:3306" benutzt.

    Und nein, ich werde kein fertiges Beispiel liefern, weil es eine dumme Idee ist eine direkte Verbindung zu der Datenbank herzustellen, eventuell kommt noch jemand auf die Idee die Login Daten in die Anwendung zu integrieren.
    <<<Und nein, ich werde kein fertiges Beispiel liefern,

    genau, das kannst du auch nicht, es ist nicht möglich nach Strato auch über SSH eine Verbindung zum SQL aufzubauen.

    Siehe hier unten ein fertiges Code, was auf anderen Providern funktioniert aber nicht bei Strato.

    VB.NET-Quellcode

    1. Dim connectionInfo As PasswordConnectionInfo = New PasswordConnectionInfo("ssh.strato.de", "xxx.de", "passwort") With {
    2. .Timeout = TimeSpan.FromSeconds(30)
    3. }
    4. Dim client As SshClient = New SshClient(connectionInfo)
    5. client.Connect()
    6. If client.IsConnected Then
    7. MsgBox("SSH connected.")
    8. Else
    9. MsgBox("SSH not connected.")
    10. End If
    11. Dim PortNat As ForwardedPortLocal = New ForwardedPortLocal("127.0.0.1", Convert.ToUInt32(3306), "rdbms.strato.de", Convert.ToUInt32(3306))
    12. client.AddForwardedPort(PortNat)
    13. PortNat.Start()
    14. Dim csb As MySqlConnectionStringBuilder = New MySqlConnectionStringBuilder With {
    15. .Server = "127.0.0.1",
    16. .Port = PortNat.BoundPort,
    17. .UserID = "dbuxxxxx",
    18. .Password = "passwort",
    19. .Database = "dbsxxxxx"}
    20. Dim connection As MySqlConnection = New MySqlConnection(csb.ConnectionString)
    21. connection.Open()