Отобразить полный вывод оболочки SSH, включая сообщение для входа и приглашение на C #

Я пытаюсь создать простой SSH-клиент на C #. Теперь это мой код:

using Renci.SshNet;

public static void Main(string[] args)
{
    AuthenticationMethod method = new PasswordAuthenticationMethod("pi", "raspberry");
    ConnectionInfo connection = new ConnectionInfo("192.168.91.134", "pi", method);
    SshClient client = new SshClient(connection);

    if (!client.IsConnected)
    {
        Console.WriteLine("Not Connected...");
        client.Connect();
    }

    while (true)
    {
        string command = Console.ReadLine();
        SshCommand response = client.RunCommand(command);
        Console.WriteLine(response.Result);
    }

}

Проблема:

  • вот так, он показывает только ответ на отправленную команду. Я хотел бы получить весь вывод, также с пользователем и текущим каталогом (как классическая оболочка SSH).

  • если я хочу запустить sudo su command с указанием пароля, это не сработает ... (в будущем я хочу добавить вывод в список и принимать ввод из текстового поля в приложении winForms)

Заранее спасибо за вашу помощь


person Jules    schedule 11.04.2020    source источник
comment
Вы видели это сообщение от 2014 года?   -  person Axel Kemper    schedule 11.04.2020


Ответы (2)


Если вы хотите реализовать клиентский терминал SSH (например, PuTTY), вам необходимо использовать канал оболочки SSH.

В SSH.NET используйте SshClient.CreateShell или SshClient.CreateShellStream, а не SshClient.RunCommand.

person Martin Prikryl    schedule 13.04.2020

Это моя реализация:

using System;
using System.Threading;
using Renci.SshNet;

public class Program
{
    public static void Main(string[] args)
    {
        SshClient sshClient = new SshClient("192.168.91.134", 22, "pi", "raspberry");

        sshClient.ConnectionInfo.Timeout = TimeSpan.FromSeconds(120);
        sshClient.Connect();

        ShellStream shellStreamSSH = sshClient.CreateShellStream("vt-100", 80, 60, 800, 600, 65536);

        Thread thread = new Thread(() => recvSSHData(shellStreamSSH));

        thread.Start();

        while (true)
        {
            string command = Console.ReadLine();

            shellStreamSSH.Write(command + "\n");
            shellStreamSSH.Flush();
        }
    }

    public static void recvSSHData(ShellStream shellStreamSSH)
    {
        while (true)
        {
            try
            {
                if (shellStreamSSH != null && shellStreamSSH.DataAvailable)
                {
                    string strData = shellStreamSSH.Read();

                    Console.WriteLine(strData);
                }
            }
            catch
            {

            }

            System.Threading.Thread.Sleep(200);
        }
    }
}
person Jules    schedule 15.04.2020
comment
Я долго искал, как это сделать. Я не смог найти никакой документации. Каждый другой пример либо показывает, как выполнить отдельную команду, либо сосредоточен на SFTP. Спасибо вам большое за размещение этого. У меня это сработало отлично. Теперь я могу взаимодействовать с оболочкой Bourne на удаленном компьютере. Я хотел, чтобы реализация C # могла отправлять команды, сгенерированные программным обеспечением, а также вводить свои собственные команды. - person Mark T; 17.07.2020