【问题标题】:C# SSH tunnel Postgres database connectionC# SSH 隧道 Postgres 数据库连接
【发布时间】:2020-02-01 01:53:20
【问题描述】:

我正在尝试通过 SSH 隧道连接到远程服务器上的 Postgres 数据库。我正在使用 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 连接到数据库。

【问题讨论】:

    标签: c# ssh npgsql ssh-tunnel ssh.net


    【解决方案1】:

    端口转发的远程端在服务器上解析。因此,您需要以一种可行的方式设置 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();
    }
    

    相关:MySQL port forwading in SSH.NET - An attempt was made to access a socket in a way forbidden by its access permissions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 2014-07-20
      • 2014-09-17
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多