向使用 SSH.NET SshClient.RunCommand 执行的命令 (cli) 提供 input/subcommands

Providing input/subcommands to a command (cli) executed with SSH.NET SshClient.RunCommand

我使用 Renci SSH.NET 库创建了一个程序。它发送所有命令并正常读取结果。但是,当我发送以下命令时:

client.RunCommand("cli");

程序无限期挂在这一行。

对发生的事情有任何解释吗?

cli是Juniper上使用的命令switches/routers。

AFAIK,cli 是一种 shell/interactive 程序。所以我假设你已经尝试过做类似的事情:

client.RunCommand("cli");
client.RunCommand("some cli subcommand");

错了。 cli 将一直等待子命令并且永远不会退出,直到您使用相应的命令(如 exit)明确关闭它。退出后,服务器将尝试将 cli subcommand 作为单独的顶级命令执行,但也失败了。


您必须将“cli 子命令”提供给 cli 命令的输入。但遗憾的是 SSH.NET 不支持使用 SshClient.RunCommand/SshClient.CreateCommand 接口提供输入。参见 Allow writing to SshCommand


有两种解决方法:

  • 使用服务器 shell 的适当语法在服务器上生成输入,例如:

    client.RunCommand("echo \"cli subcommand\" | cli");
    
  • 或使用 shell 会话(否则不推荐使用自动执行命令的方法)。

    使用SshClient.CreateShellStreamSshClient.CreateShell并将命令发送到其输入:

    "cli\n" + "cli subcommand\n"
    

    有关示例代码,请参阅 or