Zal*_*ode 3 .net c# ssh ssh.net juniper
我使用 Renci SSH.NET 库创建了一个程序。它发送所有命令并正常读取结果。但是,当我发送以下命令时:
client.RunCommand("cli");
Run Code Online (Sandbox Code Playgroud)
程序无限期地挂在这条线上。
对正在发生的事情有什么解释吗?
的cli是在Juniper使用命令交换机/路由器。
AFAIK,cli是一种 shell/交互式程序。因此,我假设您已尝试执行以下操作:
client.RunCommand("cli");
client.RunCommand("some cli subcommand");
Run Code Online (Sandbox Code Playgroud)
那是错误的。cli将继续等待子命令并且永不退出,直到您使用相应的命令(如exit)明确关闭它。退出后,服务器将尝试将其cli subcommand作为单独的顶级命令执行,但也会失败。
您必须将“cli 子命令”提供给命令的输入cli。但不幸的是,SSH.NET 不支持通过SshClient.RunCommand/SshClient.CreateCommand接口提供输入。请参阅允许写入 SshCommand。
有两种解决方案:
使用服务器 shell 的适当语法在服务器上生成输入,例如:
client.RunCommand("echo \"cli subcommand\" | cli");
Run Code Online (Sandbox Code Playgroud)
或者使用 shell 会话(否则不推荐用于自动执行命令的方法)。
使用SshClient.CreateShellStream或SshClient.CreateShell并将命令发送到其输入:
"cli\n" + "cli subcommand\n"
Run Code Online (Sandbox Code Playgroud)
有关示例代码,请参阅为使用 SSH.NET SshClient.CreateShellStream或C# send Ctrl+Y over SSH.NET执行的命令 (sudo/su) 提供子命令。