+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Connessione SSH al database Postgres con VB.NET

  1. #1
    ljt
    ljt non è in linea Scolaretto
    Post
    202

    Connessione SSH al database Postgres con VB.NET

    Buonasera a tutti,

    sto cercando di connettermi al database postgres in modo alternativo utilizzando la connessione SSH (porta 22), utilizzando vb.net.
    La stringa per la connessione che sto tentando di utilizzare è la seguente:
    codice:
    Dim conn As NpgsqlConnection
    conn = New NpgsqlConnection("Server=192.168.1.1;Port=22;User id=UTENTE;Password=PWD;Database=DATABASE;")
    conn.Open()
    Ma ricevo errore di I/O
    La password e l'utente sono corretti e a questo punto le mie domande sono:

    La stringa che utilizzo è corretta?
    Devo aggiungere qualcos'altro?

    Utilizzando il programma DBEAVER in SSH riesco a connettermi.
    In vb.net al server postgres mi connetto correttamente via ssh.
    codice:
        Dim host As String = "192.168.1.1"
        Dim Utente As String = "UTENTE"
        Dim password As String = "PWD"
        Dim connInfo As New Renci.SshNet.PasswordConnectionInfo(Host, Utente, Password)
        Dim sshClient As New Renci.SshNet.SshClient(connInfo)
        Dim cmd As Renci.SshNet.SshCommand = Nothing
    
           Using SshClient
                Try
                    SshClient.Connect()
                Catch
                    sshClient.Disconnect()
                    Exit Sub
                End Try
            End Using
    Grazie a tutti

  2. #2
    ljt
    ljt non è in linea Scolaretto
    Post
    202
    La prima parte del problema sono riuscito a risolverlo.
    Qui il codice corretto:
    codice:
           'CONNESSIONE IN SSH AL SERVER POSTGRES
            Dim connectionInfo As New PasswordConnectionInfo("192.168.1.1", "MioUtente", "MiaPassword")
            connectionInfo.Timeout = TimeSpan.FromSeconds(30)
            Dim client = New SshClient(connectionInfo)
            client.Connect()
    
            'CREA IL TUNNEL SSH
            Dim portFwld As New ForwardedPortLocal("127.0.0.1", Convert.ToUInt32(22), "192.168.1.1", 
                         Convert.ToUInt32(5432))
            'OPPURE PIU' SEMPLICEMENTE:        
            'Dim portFwld as new ForwardedPortLocal("127.0.0.1", 22, "192.168.2.78", 5432)
    
            client.AddForwardedPort(portFwld)
            portFwld.Start()
    
            'CONNESSIONE AL DATABASE POSTGRES
            Dim connessione As NpgsqlConnection
            connessione = New NpgsqlConnection("Server=127.0.0.1;Port=22;User id=MioUtente;Password=MiaPassword;Database=MioDatabase;")
            Dim CMD As New NpgsqlCommand
            Dim SQL As String = ""
            Dim RD As NpgsqlDataReader
    
            connessione.Open()
    Fino a qui tutto ok, la connessione avviene.
    Poi ho aggiunto i comandi per l'esecuzione della query:
    codice:
            SQL = "select * from MioDatabase;"
            CMD.CommandText = SQL
            RD = CMD.ExecuteReader
    
            If RD.Read Then
                MsgBox(RD("totale").ToString.Trim)
            Else
                MsgBox("Nessun dato nel database", MsgBoxStyle.Information)
            End If
    Purtroppo mi viene restituito l'errore nella riga:
    codice:
    RD = CMD.ExecuteReader
    Con l'errore seguente:
    The Connection is not open.

    Eppure la connessione risulta aperta regolarmente.

    Qualche suggerimento in merito?

    Grazie di nuovo

  3. #3
    ljt
    ljt non è in linea Scolaretto
    Post
    202
    Trovato l'arcano.
    mancava il comando:
    codice:
    CMD.Connection = connessione
    La connessione c'era ma non avevo assegnato il comando da eseguire.
    Dunque il codice corretto è il seguente:
    codice:
    'CONNESSIONE IN SSH AL SERVER POSTGRES
            Dim connectionInfo As New PasswordConnectionInfo("192.168.1.1", "MioUtente", "MiaPassword")
            connectionInfo.Timeout = TimeSpan.FromSeconds(30)
            Dim client = New SshClient(connectionInfo)
            client.Connect()
    
            'CREA IL TUNNEL SSH
            Dim portFwld As New ForwardedPortLocal("127.0.0.1", Convert.ToUInt32(22), "192.168.1.1", 
                         Convert.ToUInt32(5432))
            'OPPURE PIU' SEMPLICEMENTE:        
            'Dim portFwld as new ForwardedPortLocal("127.0.0.1", 22, "192.168.2.78", 5432)
    
            client.AddForwardedPort(portFwld)
            portFwld.Start()
    
            'CONNESSIONE AL DATABASE POSTGRES
            Dim connessione As NpgsqlConnection
            connessione = New NpgsqlConnection("Server=127.0.0.1;Port=22;User id=MioUtente;Password=MiaPassword;Database=MioDatabase;")
            Dim CMD As New NpgsqlCommand
            Dim SQL As String = ""
            Dim RD As NpgsqlDataReader
    
            connessione.Open()
    
            'CODICE MANCANTE
            CMD.Connection = connessione
    
            SQL = "select * from MioDatabase;"
            CMD.CommandText = SQL
            RD = CMD.ExecuteReader
    
            If RD.Read Then
                MsgBox(RD("totale").ToString.Trim)
            Else
                MsgBox("Nessun dato nel database", MsgBoxStyle.Information)
            End If
    Grazie a tutti e speriamo che serva a qualcun'altro.

  4. #4
    ljt
    ljt non è in linea Scolaretto
    Post
    202
    Scusate se riapro la seguente discussione, ma dato che l'argomento è strettamente inerente e collegato ho preferito non aprirne uno nuovo.
    Vengo subito al dunque.
    Il suddetto codice viene utilizzato in un programma dove è possibile scegliere il tipo di connessione al database, in questo caso Postgres.
    Scendendo un po più nel dettaglio, nella mainForm c'è una voce "Configurazione" che mi permette di scegliere se utilizzare "Tunnel SSH" oppure no.
    La scelta dell'operatore viene salvata in un file di testo nella cartella del programma.
    Il problema che ho è il seguente:
    Quando apro la "Configurazione" per cambiare altre voci e il parametro "connessione SSH" è su si e salvo mi viene visualizzato il seguente errore:
    codice:
           Di norma è consentito un solo utilizzo di ogni indirizzo di socket (protocollo/indirizzo di rete/porta)
    Dunque all'inizio dell'apertura della form "Configurazione" ho aggiunto:
    codice:
            client.RemoveForwardedPort(portFwld)
            portFwld.Stop()
            client.Disconnect()
    Ovvero rimuovo il portforwarded e lo fermo. Per precauzione chiudo anche la connessione SSH (client.disconnet) (Vedere codice sopra postato)
    Ma ciò nonostante ottengo comunque l'errore. Come se la chiusura non avesse nessun risultato.
    Sinceramente non riesco a capirne la motivazione.

    Avete qualche consiglio in merito.

    Grazie a tutti


    Riporto il codice che utilizzo per aprire la connessione SSH e il portforwarded:
    codice:
       Public Sub ApriTunnelSSH(ByVal controllo As Boolean)
    
            'CONNESSIONE IN SSH AL SERVER DEL DATABASE POSTGRES
            Dim connectionInfo As New PasswordConnectionInfo(Server, UtenteSSH, PasswordSSH)
            connectionInfo.Timeout = TimeSpan.FromSeconds(30)
            Dim client = New SshClient(connectionInfo)
            Dim portFwld As New ForwardedPortLocal("127.0.0.1", Convert.ToUInt32(PortaSSH), Server, Convert.ToUInt32(Porta))
    
            'CHIUDE IL TUNNEL SSH
            client.RemoveForwardedPort(portFwld)
            portFwld.Stop()
            client.Disconnect()
    
            Try
                client.Connect()
            Catch
                MsgBox("Impossibile connettersi in SSH al server", MsgBoxStyle.Critical)
                Exit Sub
            End Try
    
            'CREA IL TUNNEL SSH FACENDO IL FORWARD DALLA PORTA 22 ALLA PORTA 5432
            Try
                client.AddForwardedPort(portFwld)
                portFwld.Start()
            Catch ex As Exception
                MsgBox("Attenzione si è verificato il seguente errore:" & vbCrLf & vbCrLf & _
                       ex.Message, MsgBoxStyle.Critical)
                Exit Sub
            End Try
    
        End Sub

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi