Я пытаюсь автоматически создать соединение S SH для программы, которая использует туннель S SH для обновления локальной базы данных с удаленного сервера PostgreSQL. До этого я вручную открывал туннель с помощью PuTTY (включая инструкции по переадресации локальных портов с помощью команды -L). Я хочу использовать s sh. net для автоматического открытия порта при запуске программы. Как только соединение установлено, программа использует Entity Framework Core для доступа к удаленной базе данных.
Когда я открываю соединение S SH с PuTTY, программа работает нормально. Это команда PuTTY:
//plink.exe -i "C:\Users\user.name\Desktop\host_private_key.ppk" -L 6544:111.22.33.66:6543 -N user@address.io -pw *PASSWORD*"
(данные для входа удалены для конфиденциальности)
Это код s sh. 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 () платформы Entity Framework передает подробные данные о соединении. с его 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
Я дважды проверил все пароли и прочитал всю документацию и примеры кода S SH. NET и оставил все ранее работающий (через PuTTY) код без изменений.
Если кто-нибудь увидит, что я делаю не так, буду благодарен. C#, S SH. NET и переадресация портов являются новыми для меня, пожалуйста, скажите мне, где я идиот.