如何快速处理netmiko的大量输出?

时间:2019-07-09 16:40:44

标签: python-3.x

我正在尝试从我们网络上的设备获取vpn列表。该列表很长,没有进一步输入就无法完全返回。有没有一种方法可以快速获取完整列表,而无需循环并通过ssh连接反复发送回车命令?

我尝试使用send命令,但是由于尾随字符是<--- More --->而不是预期的字符,所以超时。 send_command_timing不会超时,但是只会返回整个列表的一小部分,并在结尾加上<--- More --->文字,表明我什么都没得到。目前,我使用send_command_timing反复遍历循环以获取下一行,然后从输出中剥离<--- More --->字符串。问题在于该方法非常慢,无法以任何现实的方式使用。

from netmiko import ConnectHandler

device = {
    'device_type': 'cisco_ios',
    'host': "example.host",
    'username': "user",
    'password': "pass",
}
trailingString = "<--- More --->"

connect = ConnectHandler(**device)

print("Connection complete")

connect.send_command("enable 3" + '\n', expect_string="Password:")
connect.send_command("pass" + '\n', expect_string="#")

output = connect.send_command_timing("sho vpn-sessiondb svc")

while trailingString in output:
    if(output.endswith(trailingString)):
        output = output[:-(len(trailingString) + 1)] # Added + 1 to remove the trailing newline
        output += connect.send_command_timing("\n")

print(output)
connect.disconnect()

我还没有找到一种解决方案来足够快地检索send_command_timing函数的所有输出,以使其合理使用。我希望有一种更好/更快的方式来获取此信息。

4 个答案:

答案 0 :(得分:1)

您似乎正在使用“ cisco_ios”设备类型,但正在连接到Cisco ASA(基于您要发送的“ show vpn-sessiondb svc”命令)?

Netmiko应该在SSH连接完成后不久自动禁用输出分页。因此,您不应在输出中看到'<--- More --->字符串。

我怀疑如果将Netmiko设备类型切换为“ cisco_asa”,则输出页面调度问题将消失。

或者用不同的措词,因为您正在使用“ cisco_ios”设备类型,所以将错误的命令禁用了输出分页,该命令已发送到远程设备。切换到正确的设备类型后,应发送正确的命令(即Netmiko将自动发送“终端寻呼机0”命令)。

答案 1 :(得分:0)

我无法直接通过netmiko找到解决方案,但是通过更改设备本身的某些值,我可以获得全部输出。对于我连接到的特定设备,使用终端寻呼机0删除默认的行数限制。

因此,通过在运行connect.send_command_timing(“ sho vpn-sessiondb svc”)之前使用connect.send_command(“ terminal pager 0”),我能够获得整个返回值。

connect = ConnectHandler(**device)
#connect =  Netmiko(**device)
print("Connection complete")
connect.send_command("enable 3" + '\n', expect_string="Password:")
connect.send_command("enable3secret" + '\n', expect_string="#")
connect.send_command("terminal pager 0")
output = connect.send_command_timing("sho vpn-sessiondb svc")

答案 2 :(得分:0)

我建议您检查一下您是否可以运行 terminal length 0。如果这在您的环境中不起作用,则可能支持此命令的其他一些变体。

答案 3 :(得分:0)

我遇到了类似的问题。我通过将目标设备会话的 global_delay_factor 设置为“2”来解决此问题 This link explains the concepts in greater detail

    device = {
    'device_type': 'cisco_ios',
    'host': "x.x.x.x",
    'username': 'some_user',
    'password': 'some_pass',
    'global_delay_factor': 2
}
ssh = ConnectHandler(**device)
output = ssh.send_command("show running")
print(output)



enter code here