我使用 Renci SSH.NET 库创建了一个程序。它发送所有命令并正常读取结果。但是,当我发送以下命令时:
client.RunCommand("cli");
程序无限期地挂在这条线上。
对发生的事情有什么解释吗?
The cli
是在 Juniper 交换机/路由器上使用的命令。
AFAIK, cli
是一种 shell/交互式程序。所以我假设你尝试过做类似的事情:
client.RunCommand("cli");
client.RunCommand("some cli subcommand");
那是错误的。cli
将继续等待子命令并且永远不会退出,直到您使用相应的命令显式关闭它(例如exit
)。退出后,服务器会尝试执行cli subcommand
作为一个单独的顶级命令,也失败了。
您必须将“cli 子命令”提供给cli
命令。但不幸的是 SSH.NET 不支持提供输入SshClient.RunCommand
/SshClient.CreateCommand
界面。看允许写入 SshCommand https://github.com/sshnet/SSH.NET/issues/802.
有两种解决方案:
-
使用服务器 shell 的适当语法在服务器上生成输入,例如:
client.RunCommand("echo \"cli subcommand\" | cli");
-
或者使用 shell 会话(否则不建议使用这种方法来自动执行命令)。
Use SshClient.CreateShellStream
or SshClient.CreateShell
并将命令发送到其输入:
"cli\n" + "cli subcommand\n"
示例代码请参见为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令 https://stackoverflow.com/q/54194139/850848 or C# 通过 SSH.NET 发送 Ctrl+Y https://stackoverflow.com/q/52775498/850848.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)