【发布时间】:2019-08-26 23:43:09
【问题描述】:
我使用 Renci SSH.NET 库创建了一个程序。它发送所有命令并正常读取结果。但是,当我发送以下命令时:
client.RunCommand("cli");
程序无限期地挂在这一行。
对发生的事情有任何解释吗?
cli 是用于瞻博网络交换机/路由器的命令。
【问题讨论】:
标签: c# .net ssh ssh.net juniper
我使用 Renci SSH.NET 库创建了一个程序。它发送所有命令并正常读取结果。但是,当我发送以下命令时:
client.RunCommand("cli");
程序无限期地挂在这一行。
对发生的事情有任何解释吗?
cli 是用于瞻博网络交换机/路由器的命令。
【问题讨论】:
标签: c# .net ssh ssh.net juniper
AFAIK,cli 是一种 shell/交互式程序。所以我假设你已经尝试做类似的事情:
client.RunCommand("cli");
client.RunCommand("some cli subcommand");
错了。 cli 将继续等待子命令并且永远不会退出,直到您使用相应的命令(如 exit)明确关闭它。并且退出后,服务器会尝试将cli subcommand作为单独的*命令执行,同样失败。
您必须将“cli 子命令”提供给cli 命令的输入。但遗憾的是 SSH.NET 不支持使用 SshClient.RunCommand/SshClient.CreateCommand 接口提供输入。见Allow writing to SshCommand。
有两种解决方案:
使用服务器外壳的适当语法在服务器上生成输入,例如:
client.RunCommand("echo \"cli subcommand\" | cli");
或使用 shell 会话(否则不推荐使用这种方法来自动执行命令)。
使用SshClient.CreateShellStream 或SshClient.CreateShell 并将命令发送到其输入:
"cli\n" + "cli subcommand\n"
有关示例代码,请参阅 Providing subcommands to a command (sudo/su) executed with SSH.NET SshClient.CreateShellStream 或 C# send Ctrl+Y over SSH.NET。
【讨论】: