Использование SSH.NET для подключения к удаленным хостам

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

На этих устройствах работает какой-то тип ОС Linux, я точно не уверен, но они имеют включенный SSH и подтверждают ключи хоста сервера при первом подключении к ним с помощью такой утилиты, как PuTTY.

На данный момент я просто пытаюсь инициировать сеанс SSH с устройством. Я провел довольно много исследований и пришел к следующему:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Renci.SshNet;
using Renci.SshNet.Common;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Connection information
            string user = "admin";
            string pass = "********";
            string host = "IP Address";

            //Set up the SSH connection
            using (var client = new SshClient(host, user, pass))
            {

                //Accept Host key
                client.HostKeyReceived += delegate (object sender, HostKeyEventArgs e)
                {
                    e.CanTrust = true;
                };

                //Start the connection
                client.Connect();

                var output = client.RunCommand("show device details");


                client.Disconnect();
                Console.WriteLine(output.ToString());
                Console.ReadLine();
            }
        }
    }
}

Проблема в том, что это, похоже, не выполняет указанную команду. Появляется окно консоли, и я могу получить доступ к тому же устройству через WebGUI и просмотреть файл журнала, он показывает установленное соединение, но когда я прерываю выполнение и вижу значения переменных, выходная переменная показывает нуль.

Если я оставлю выполнение с открытым окном консоли (просто показывает мигающий курсор в левом верхнем углу), время ожидания соединения истекает через 10 минут, и соединение теряется, что я также вижу в журнале устройства.

Почему это не выполняет команду run и не сохраняет результаты в выходной переменной?


person suddenlyNate    schedule 19.10.2016    source источник
comment
Эти устройства могут не поддерживать запросы ssh exec. Попробуйте запустить ssh admin@host 'show device details' из командной строки и посмотрите, получите ли вы ожидаемый результат.   -  person Kenster    schedule 19.10.2016


Ответы (1)


Когда вы выполняете метод RunCommand() для объекта типа Renci.SshNet.SshClient, он не возвращает результат в виде переменной. Вместо этого он возвращает объект типа Renci.SshNet.SshCommand.

Проблема в том, что похоже, что вы не можете поместить этот результирующий объект SshCommand в var.

Этот Renci.SshNet.SshCommand, возвращаемый при выполнении RunCommand(), будет содержать несколько свойств и методов. Свойства:

  • Командный текст
  • Время ожидания команды
  • ВыходСтатус
  • Выходной поток
  • Расширенный выходной поток
  • Результат
  • Ошибка

Все они полезны, но, поскольку все остальное, кажется, работает, единственное, что вам нужно, это «Результат». Свойство «Результат» будет содержать строку, которая будет результатом хост-потока команды, которую вы предоставили для RunCommand().

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

Приложение:

Следующая строка в исходном коде сообщения:

var output = client.RunCommand("show device details");

Следует заменить на этот код:

var output = client.RunCommand("show device details").Result;

Это назначит свойство Result (которое является строкой) переменной output, что даст желаемый результат.

person Jon    schedule 03.03.2017
comment
я пытаюсь это на брандмауэре. Что дает мне такие варианты, как выбрать 1, 2 или 3. Как отправить выбор из перечисленного меню, заданного брандмауэром? Я пробовал RunCommand(2), но он не работает - person parthraj panchal; 16.10.2020