1

我正在编写一个与众多系统交互的应用程序,特别是与交换机,

我正在尝试实现一个功能,使我能够使用 Fabric(python)从特定交换机检索日志

在与交换机的实际会话中,我需要先运行“启用”(并按 Enter 键),然后运行“调试生成转储”命令。

使用 fabric.operations.run() 我一次只能发出一个命令,使用 fabric.operations.open_shell() 不是一种选择,因为我需要解析输出并在完成后关闭连接。

有人可以帮忙吗?谢谢!!

以下是代码示例:

def getSwitchLog(self, host, port, username, password):
        env.host_string = "%s:%s" % (host, port)
        env.user = username
        env.password = password
        command = 'enable \r debug generate dump'
        run(command, shell=cli, pty=True, combine_stderr=True, timeout=120)
  • shell=cli - 因为开关不运行 bash 并且 'cli' 在这种情况下是合适的值

  • \r 应该发送“输入”键本质上发送 1.启用 2.输入 3.调试生成转储

  • 如果我使用 open_shell 切换运行,则此方法有效,但似乎运行忽略 \r

我能够使用以下方法实现我需要的东西:

command = 'sshpass -p admin ssh admin@switchIP cli \"enable\" \"show version\"'
fabric.api.local(command, capture=True, shell=None)

但是这种方法不如 fabric.api.run() 健壮,并且还需要运行节点安装 sshpass

这是交换机 CLI 的输出示例,因为命令以交互方式(键盘)输入,没有结构

[standalone: master] > enable
[standalone: master] # debug generate dump
[standalone: master] # debug generate dump Generated dump sysdump-SX6036-1-20130630-104051.tgz
[standalone: master] #

谢谢。

4

2 回答 2

0

因此,使用会话状态不是 Fabric 所做的事情。每个电话都是一个新的会话。还有一些其他项目试图解决这个问题,一个是fexpect,但由于你试图查询一个开关,我不相信这会奏效。由于 fexpect(我最后一次知道)上传了一个期望脚本,然后它运行到远程机器上。

不过,您可能会更幸运的是来自 pexpect 模块的 pxssh。它允许像 ssh+expect 这样的工作足够简单。它在 Fabric 之外,但我认为更有可能在大门外为您工作。

于 2014-01-14T20:49:25.750 回答
0

使用基于“paramiko”的机器人框架。它有更简单的 API (write/read_unitl/read_all) 来与你的 switch shell 交互。

http://robotframework.org/SSHLibrary/latest/SSHLibrary.html

于 2016-05-27T19:24:03.140 回答