【问题标题】:Execute several commands on Cisco switch via Paramiko - improve performance通过 Paramiko 在 Cisco 交换机上执行多个命令 - 提高性能
【发布时间】:2018-10-05 12:47:01
【问题描述】:

我正在尝试登录思科交换机并在那里做一些事情(例如配置一个端口)。我显然不能在 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_command 调用?
  • 因为这会关闭通道并且当我的意图是配置端口时,我必须在同一个会话中发送多个命令。 (我认为这就是它的工作原理)

标签: python-2.7 ssh paramiko cisco


【解决方案1】:

一般来说,您应该为此使用“exec”通道。 “shell”通道不应用于自动执行命令。

但我了解您的服务器不支持“exec”通道的多个命令。 我已经为其他读者添加了上述评论,除非他们真的必须这样做,否则不要尝试使用此解决方案。


如果必须使用“shell”通道,则必须使用 shell 技术。

因此,在您的特定情况下,您可能希望在命令完成后让远程 shell 打印一些唯一的字符串:

channel.send("show arp\necho Command-has-finished\n")

然后你继续阅读输出,直到找到一行"Command-has-finished"

检查来自JSch Exec.java example的阅读码。

【讨论】:

  • 好主意!我现在正在一个接一个地阅读。完整实现的脚本应该只读取整个输出并查找字符串。有选择吗?比channel.recv(9999) 更好的东西?
  • 我已经添加了答案的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2021-02-28
  • 2014-11-24
  • 1970-01-01
相关资源
最近更新 更多