C# SSH 隧道 Postgres 数据库连接
C# SSH tunnel Postgres database connection
我正在尝试通过 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: 'Exception while reading from stream'
EndOfStreamException: Attempted to read past the end of the stream.
我可以使用 DBeaver 连接到数据库。
端口转发的远端在服务器上解析。因此,您需要以一种有效的方式设置 IP address/hostname,因为它是从服务器本身 连接的 。
数据库可能只监听 localhost
接口。不在 public 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();
}
相关:
我正在尝试通过 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: 'Exception while reading from stream' EndOfStreamException: Attempted to read past the end of the stream.
我可以使用 DBeaver 连接到数据库。
端口转发的远端在服务器上解析。因此,您需要以一种有效的方式设置 IP address/hostname,因为它是从服务器本身 连接的 。
数据库可能只监听 localhost
接口。不在 public 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();
}
相关: