在z / OS上使用SSH.NET通过SSH更改密码的命令

问题描述

我正在寻找自动化密码更改的方法,例如:

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);
    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来完成。如果不是,那么从C#中执行此操作的好方法是什么?

解决方法

您的服务器似乎不支持“ shell”通道,仅支持“ exec”通道。

确实,SSH.NET不支持为使用“ exec”通道执行的命令提供输入。参见Providing input/subcommands to a command (cli) executed with 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之类的外部工具(我不喜欢那样,但这可能是最简单的方法)。参见Sending input during command output with SSH.NET