C # SSH туннель Соединение с базой данных Postgres - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь подключиться к базе данных Postgres на удаленном сервере через туннель SSH. Я использую SSH.NET и библиотеку Npgsql. Вот мой пример кода:

using (var client = new SshClient("210.130.90.110", "root", "pasword"))
{
    client.Connect();

    if (!client.IsConnected)
    {
        // Display error
        Console.WriteLine("Client not connected!");
    }
    else
    {
        Console.WriteLine("Client connected!");
    }

    var port = new ForwardedPortLocal("127.0.0.1", 15432, "210.130.90.110", 5432);
    client.AddForwardedPort(port);

    port.Start();

    using (var conn = new NpgsqlConnection("Server=127.0.0.1;Database=dbname;Port=15432;User Id=dbuser;Password=dbpassword;"))
    {
        conn.Open();
    }

    port.Stop();
    client.Disconnect();
}

После выполнения кода я получаю:

Npgsql.NpgsqlException: «Исключение при чтении из потока» EndOfStreamException: Попытка чтения после окончанияпоток.

Я могу подключиться к базе данных с помощью DBeaver.

1 Ответ

1 голос
/ 03 октября 2019

Удаленный конец переадресации портов разрешен на сервере. Поэтому вам нужно настроить IP-адрес / имя хоста так, чтобы он работал, так как вы подключаете от самого сервера .

База данных, вероятно, прослушивает только интерфейс localhost. Не на общедоступном IP-адресе (в противном случае вам, возможно, не понадобится перенаправление портов в первую очередь).

Кроме того, не стоит жестко кодировать локальный перенаправленный порт. Вы не можете знать, если этот порт еще не занят другим приложением. Позвольте системе выбрать любой свободный локальный порт.

var port = new ForwardedPortLocal("127.0.0.1", "127.0.0.1", 5432);
client.AddForwardedPort(port);
port.Start();

string connString =
    $"Server={port.BoundHost};Database=dbname;Port={port.BoundPort};" +
     "User Id=dbuser;Password=dbpassword;";

using (var conn = new NpgsqlConnection(connString))
{
    conn.Open();
}
...