SSH.NET не выполняет команду на устройстве
Я пытаюсь отправить простую команду через SSH, используя SSH.NET. Даже самый простой тестовый код не пройден. Вот фрагмент.
using (var ssh = new SshClient("ip", port, "username", "password"))
{
ssh.Connect();
while (true)
{
var result = ssh.RunCommand("AT").Execute();
Console.Out.WriteLine(result);
}
}
AT
команда должна вернуть эхо, но нет. Вместо этого я получаю пользовательское сообщение о тайм-ауте, выданное целью SSH. Я вижу имя устройства в сообщении тайм-аута, которое соответствует приглашению, которое оно использует, и из этого я могу заключить, что вход в систему работает (также проверено с различными программами SSH), но сама команда не выполняется. Я пытался добавить \n
а также \r\n
к командам, но безрезультатно. Что я делаю неправильно?
Редактировать 1: вывод из результата \r\nCommand Line Interface\r\nDeviceName> Custom idle timeout
Я думаю, что окончания строк преобразуются в Windows с помощью Visual Studio.
Редактировать 2: Использование Plink plink.exe username@ip -pw password "AT" > log.txt
приводит к тому же выводу, что и Visual Studio. Plink ждет до истечения времени ожидания и завершается и log.txt
содержит \r\nCommand Line Interface\r\nDeviceName> Custom idle timeout
,
Используя PuTTY, я вижу, что
Using username "username".
username@host's password:
Entering character mode
Escape character is '^]'.
Command Line Interface
DeviceName>
написано до того, как вы сможете начать вводить команды. Может быть, команда введена до того, как хост готов ее принять, и в результате команда зависает до тех пор, пока не произойдет какая-то реакция?
1 ответ
Ваш сервер, очевидно, не поддерживает канал exec SSH, который используется за SSH.NET SshClient.RunCommand
метод и PLink's plink.exe command
синтаксис.
Или на самом деле это поддерживает, но неправильно. Кажется, для запуска интерактивной сессии (оболочки) вместо выполнения команды.
Чтобы подтвердить это предположение, попробуйте это с помощью PLink:
echo AT| plink username@ip -pw password > log.txt
Если это работает, вам может понадобиться SshClient.CreateShell
(SSH "оболочка" канал ") вместо SshClient.RunCommand
, Хотя это, как правило, неправильный подход, вы должны использовать этот подход из-за вашего сломанного сервера.