我正在编写一个与众多系统交互的应用程序,特别是交换机,
我正在尝试实现一个功能,使我能够使用Fabric(python)从特定交换机中检索日志
在交换机的实际会话中,我需要先运行“启用”(然后按回车键),然后运行“debug generate dump”命令。
使用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 \ n应该发送“enter”键实际上是发送1.启用2.输入3. debug generate dump
如果我使用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] #
感谢。
答案 0 :(得分:0)
因此使用会话状态不是Fabric所做的事情。每次通话都是新会话。还有一些其他项目试图解决这个问题,其中一个很有意思,但是由于你试图查询交换机,我不认为这会起作用。因为fexpect(最后我知道)上传了一个期望脚本,然后它运行到远程机器。
你可能会有更好的运气pxssh from the pexpect module。它允许ssh +期望像工作一样简单。它在Fabric之外,但我认为更有可能为你工作。
答案 1 :(得分:0)
使用基于' paramiko'的机器人框架。它有更简单的API(write / read_unitl / read_all)来与你的交换机shell进行交互。