我正在尝试为使用SSH隧道从远程PostgreSQL服务器更新本地数据库的程序自动创建SSH连接。到目前为止,我一直在使用PuTTY手动打开隧道(包括使用-L命令的本地端口转发指令)。我想使用ssh.net在程序运行时自动打开端口。建立连接后,该程序将使用Entity Framework Core访问远程数据库。
当我打开与PuTTY的SSH连接时,程序运行正常。这是PuTTY命令:
//plink.exe -i "C:\Users\user.name\Desktop\host_private_key.ppk" -L 6544:111.22.33.66:6543 -N [email protected] -pw *PASSWORD*"
(删除登录详细信息以保护隐私)
这是我试图打开相同连接的ssh.net代码:
public void MakeSSHTunnel()
{
string password = "password";
// path of RSA private key in openSSH format:
string privateKeyPath = "C:/Users/user.name/.ssh/id_rsa";
try
{
// creates variable to transmit RSA private key + passphrase to server via SSH.NET, openSSH compatible.
var privateKeyFile = new PrivateKeyFile(privateKeyPath, password);
string serverAddress = "address.io";
string user = "user";
// allows for the remote port forwarding options required by the server
using (var client = new SshClient(serverAddress, user, privateKeyFile))
{
client.Connect();
var tunnel = new ForwardedPortLocal(6544, "111.22.33.66", 6543);
client.AddForwardedPort(tunnel);
// testing weather the connection has been successful:
if (client.IsConnected)
{
Console.WriteLine("OPENTUNNEL.CS: Connection to {0} successful.", serverAddress);
state = "Open";
}
else
{
Console.WriteLine("Connection to {0} failed.");
state = "Closed";
}
tunnel.Exception += delegate (object sender, ExceptionEventArgs e)
{
Console.WriteLine(e.Exception.ToString());
};
tunnel.Start();
Program.RunBackup();
// ... closes the port ... //
tunnel.Stop();
client.Disconnect();
}
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e);
}
}
我很困惑,因为在上面,if (client.IsConnected)
返回true。
[当实体框架核心OnConfiguring()方法通过其optionsBuilder传递连接的详细信息时,似乎发生了错误:
optionsBuilder.UseNpgsql($"Host=127.0.0.1;Port=6544;Database=user;Username=user;Password=databasePassworh;CommandTimeout=300;Timeout=300;SSL Mode=Require;Trust Server Certificate=true;Convert Infinity DateTime=true");
出现的错误是:
NpgsqlException: Exception while connecting
和:
ExtendedSocketException: No connection could be made because the target machine actively refused it. 127.0.0.1:6544
我已经仔细检查了所有密码,并通读了所有SSH.NET文档和代码示例,并保留了之前所有有效的代码(通过PuTTY)。
[如果有人看到我在做什么错,我将不胜感激。 C#,SSH.NET和端口转发对我来说是新手,请告诉我我在哪里是白痴。
您可以使用它查看建立ssh连接时服务器上发生的情况:
tail -f /var/log/auth.log
id_rsa文件所属的密钥对可能不受服务器信任,在这种情况下,运行程序时,您会在服务器的auth.log中看到这样的一行:
"Failed publickey for user from <yourIP> port <yourPort> ssh2: RSA SHA256
您可以从host_private_key.ppk文件中生成一个有效密钥,因为您知道所连接的服务器信任该密钥。
使用PuttyGen加载您的host_private_key.ppk文件。在转换下,您可以“导出OpenSSH”并导出私钥。 (如果其中的键用于其他用途,请不要导出和覆盖C:/Users/user.name/.ssh中的内容。)
如果您在其他路径中创建了密钥,则使程序适应新的密钥。