Команда смены пароля через SSH с использованием SSH.NET в z/OS

Я хочу автоматизировать смену пароля, которая выполняется вручную, как таковая:

plink -ssh user@host changepass
user@host's password:
Access granted. Press Return to begin session.
Enter current password:
...

Насколько я понимаю, я не могу выполнить это с помощью RunCommand, потому что он не интерактивен и не позволит мне дополнительно указать текущий пароль, нажать Enter, затем новый пароль и т. д. Насколько я понимаю, мне придется использовать CreateShellStream для эмуляции как ад. Когда я пытаюсь сделать что-то вроде этого:

using (var client = new SshClient(host, username, password))
{
    client.Connect();

    ShellStream shellStream = client.CreateShellStream(string.Empty, 0, 0, 0, 0, 0);
    Console.Write(SendCommand("changepass", shellStream));
    
    client.Disconnect();
}

В результате получается The command executed is invalid....., то же самое, что я получаю, если пытаюсь использовать plink без указания встроенной команды:

plink -ssh -t user@host
Using username "user".
-- Pre-authentication banner message from server: ----------------------------
user@host's password:
Access granted. Press Return to begin session.
The command executed is invalid.....

Мне интересно, является ли мой подход недействительным и можно ли это сделать с помощью SSH.NET. Если нет, то что было бы хорошим способом сделать это с С#?


person e36M3    schedule 17.09.2020    source источник


Ответы (1)


Похоже, ваш сервер не поддерживает канал оболочки, только канал exec.

Действительно, SSH.NET не поддерживает ввод данных для команды, выполняемой с каналом exec. См. раздел Предоставление ввода/подкоманд команде (cli), выполняемой с помощью SSH.NET SshClient.RunCommand.

Если бы это был сервер *nix, вы могли бы попытаться предоставить ввод с помощью перенаправления ввода.

client.RunCommand("echo input | command");

Хотя 1) это небезопасный способ для паролей 2) я не знаю правильного синтаксиса для z/OS (и если это вообще возможно).


Чтобы обеспечить правильный вход, вам нужно будет взять код SSH.NET и изменить класс SshCommand, чтобы предоставить IChannelSession.Write способ, которым это делает ShellStream.Write.


Или вам придется использовать другую библиотеку (хотя я не знаю другой бесплатной хорошей библиотеки, кроме SSH.NET). Или запустите внешний инструмент, например PuTTY Plink (я не так, но это, вероятно, самый простой способ пойти). См. раздел Отправка ввода во время вывода команды с помощью SSH.NET.

person Martin Prikryl    schedule 18.09.2020