我正在尝试登录思科交换机并在那里执行一些操作(例如配置端口)。显然我无法在 cisco 设备上使用
exec_command(cmd1 \n cmd2 \n)
...所以我使用通道来发送我的命令,如下所示:
channel = ssh.invoke_shell()
channel.send("show arp\n")
while not channel.recv_ready():
time.sleep(0.5)
out = channel.recv(9999)
我不喜欢
time.sleep(0.5)
并且希望有一些东西可以动态等待命令执行,因为有时命令需要的时间甚至超过 0.5 秒,这会大大减慢一切。例如,对于 exec_command(cmd)
,我有 exit_status = channel.recv_exit_status()
。
有办法解决这个问题吗?
编辑:
我可以以某种方式收听频道并等待输出吗
CISCOSWITCH#
以便我知道我已准备好发送更多命令或
exit
?
一般来说,您应该为此使用“exec”通道。 “shell”通道不应用于自动执行命令。
但据我所知,您的服务器不支持“exec”通道的多个命令。 我为其他读者添加了上述评论,不要尝试使用此解决方案,除非他们真的必须这样做。
如果必须使用“shell”通道,就必须使用shell技术。
因此,在您的特定情况下,您可能希望让远程 shell 在命令完成后打印一些唯一的字符串:
channel.send("show arp\necho Command-has-finished\n")
然后继续阅读输出,直到找到一行
"Command-has-finished"
。
查看JSch
Exec.java
示例中的读取代码。