Предоставление подкоманд для команды (sudo / su), выполняемой с SSH.NET - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь использовать Renci SSH.NET для подключения к удаленному серверу Linux из веб-приложения C # и выполнения сценариев оболочки. Я хочу запускать сценарии один за другим. Но не понимаю, как запустить сценарии, прочитать вывод и сохранить его в метке. Я пробовал приведенный ниже код, но не смог передать несколько команд одну строку за другой.

SshClient sshclient = new SshClient("host", UserName, Password);
sshclient.Connect();
ShellStream stream = sshclient.CreateShellStream("commands", 80, 24, 800, 600, 1024);
public StringBuilder sendCommand(string customCMD)
{
    StringBuilder answer;

    var reader = new StreamReader(stream);
    var writer = new StreamWriter(stream);
    writer.AutoFlush = true;
    WriteStream(customCMD, writer, stream);
    answer = ReadStream(reader);
    return answer;
}

private void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
{
    writer.WriteLine(cmd);
    while (stream.Length == 0)
    {
        Thread.Sleep(500);
    }
}

private StringBuilder ReadStream(StreamReader reader)
{
    StringBuilder result = new StringBuilder();

    string line;
    while ((line = reader.ReadLine()) != null)
    {
        result.AppendLine(line);
    }
    return result;
}

Я пытаюсь запустить следующие команды

sudo su - wwabc11
whoami
cd /wwabc11/batch/bin/
pwd

Как запускать команды одну за другой и читать выводимую информацию? Спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Просто напишите «команды» в StreamWriter.

writer.WriteLine("sudo su - wwabc11");
writer.WriteLine("whoami");
// etc

См. Также C # отправить Ctrl + Y через SSH.NET .


Хотя обратите внимание, что использование CreateShellStream (канал "shell") не является правильным способом автоматизации выполнения команд. Вы должны использовать CreateCommand / RunCommand (канал "exec"). Хотя SSH.NET ограничивает API каналом «exec», он не поддерживает ввод команд, выполненных таким образом. И whoami, и остальные фактически являются входными данными для команды sudo / su.

Решением было бы предоставить команды для su в командной строке, например:

sudo su - wwabc11 -c "whoami ; cd /wwabc11/batch/bin/ ; pwd"

Пример кода, который использует CreateCommand для выполнения команды и считывает ее вывод, см. В разделе Мониторинг вывода команды SSH.NET в режиме реального времени .

...