Как выполнить SSH-вход с использованием ключа с помощью библиотеки SSH.NET на C#?

Здравствуйте! Я недавно начал разработку программы и столкнулся с проблемой при её выполнении. Учитывая, что я начинающий программист и в основном полагаюсь на интернет-ресурсы, хотел бы обратиться за помощью. 

Суть программы заключается в подключении по SSH к сетевому коммутатору для выполнения определенных команд. Однако в нашей сети имеется много коммутаторов, использующих устаревшую версию SSH-клиента, в результате чего при выполнении команды `ssh username@host` появляется ошибка: <b>Unable to negotiate with 172.18.54.214 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1</b>. 

Я нашёл решение, которое подразумевает добавление ключа <b>-o KexAlgorithms=diffie-hellman-group1-sha1 -o Ciphers=aes256-cbc</b>, но не знаю, как применить этот ключ в коде программы. Обновление коммутаторов сейчас невозможно из-за их небольшого количества, и я ищу решение вот уже третий день.

Вот мой код: 
<pre><code class="cs">using System.Data;
using System.Text.RegularExpressions;
using Renci.SshNet; // для ссш подключения
using System.Threading;
using System.Security.Cryptography.X509Certificates;
using System.ComponentModel.Design; // Для установки задержек между команды

class Program  
{
    private static SshClient client;

    static void Main(string[] args)
    {
        Console.WriteLine("Введите IP адрес: ");
        string host = Console.ReadLine();

        Console.WriteLine("Введите password");
        string password = Console.ReadLine();
        string modelSwitch; 
        client = new SshClient(host, "***", password);
        Console.WriteLine("1.D-Link");
        Console.WriteLine("2.Eltex");
        Console.Write("Вы...
  • 28 августа 2024 г. 15:04
Ответы на вопрос 2
Для того чтобы выполнить SSH-вход с использованием ключа с помощью библиотеки SSH.NET в C#, вам нужно установить необходимые параметры для ключей обмена (key exchange) и шифрования (ciphers). Библиотека SSH.NET позволяет вам настраивать эти параметры через объект `ConnectionInfo`. 

К сожалению, на данный момент версия SSH.NET не поддерживает методы изменения любых параметров шифрования и обмена в стандартной конфигурации. Однако вы можете использовать следующие шаги, чтобы подключиться к вашему устройству с параметрами, необходимыми для вашего случая.

Вот как вы можете изменить ваш код:

1. Убедитесь, что вы используете последнюю версию SSH.NET. Если нет, обновите ее через NuGet.
2. Измените ваш код, чтобы подключиться к коммутатору с использованием ключей.

Вот пример того, как это может выглядеть в вашем коде:

```csharp
using System;
using Renci.SshNet;

class Program  
{
    private static SshClient client;

    static void Main(string[] args)
    {
        Console.WriteLine("Введите IP адрес: ");
        string host = Console.ReadLine();

        Console.WriteLine("Введите имя пользователя: ");
        string username = Console.ReadLine();

        Console.WriteLine("Введите путь к приватному ключу: ");
        string privateKeyPath = Console.ReadLine();

        // Загрузка приватного ключа
        privateKeyPath = privateKeyPath.Trim('\"');
        var keyFile = new PrivateKeyFile(privateKeyPath);
        var keyFiles = new[] { keyFile };

        var connectionInfo = new ConnectionInfo(host, username, keyFiles);
        
        // Обратите внимание на возможность установки шифров, если ваша версия SSH.Net это поддерживает
        // В SSH.NET версии 2019.1.0 и выше, вы можете установить
        // connectionInfo.KeyExchangeAlgorithms и connectionInfo.Ciphers

        client = new SshClient(connectionInfo);

        try
        {
            client.Connect();
            Console.WriteLine("Подключено к {0}", host);

            // Здесь можно выполнять команды
            var command = client.CreateCommand("ваша команда здесь");
            string result = command.Execute();
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Ошибка подключения: " + ex.Message);
        }
        finally
        {
            client.Disconnect();
            client.Dispose();
        }
    }
}
```

### Комментарии по коду:
- Используйте `PrivateKeyFile` для загрузки вашего ключа, а затем создайте `ConnectionInfo`, передавая туда загруженный ключ.
- Если у вас есть необходимость установить специфические параметры шифрования или ключей обмена, это может потребовать дополнительных попыток на уровне SSH клиента или использования дополнительных библиотек, так как SSH.NET может не поддерживать некоторые встроенные возможности для настройки шифрования.
- Код обрабатывает ошибки подключения, и в случае успеха выполняет команду на удаленном хосте.

### Примечание:
Если вы столкнетесь с проблемами совместимости, убедитесь, что ваша библиотека обновлена до последней версии, и проверьте документацию для получения подробной информации о настройках SSH.
У SshClient больше одного конструктора,  и в том числе есть и конструктор с указанием источника приватных ключей 

ну и поиск прям копипастой вопроса притаскивает в первой пятёрке на примеры
Похожие вопросы