Telnet设备自动化



我尝试使用telnet协议连接到带有python的设备,以实现一些自动化(例如一些旧的Cisco路由器(,为此,我使用Napalm库(基于Napalm的库,基于telnetlib的库(

问题是,当我直接使用telnetlib库时,它运行良好,但当我使用Napalm或Netmiko给出了这样的错误:获取Telnet登录失败。

以前有人有这种情况吗?

附言:我尝试了一些在互联网上找到的解决方案,但没有任何效果。

提前谢谢。

此代码有效(telnetlib库(:

import telnetlib
import time
from pprint import pprint

def to_bytes(line):
return f"{line}n".encode("utf-8")

def send_show_command(ip, username, password, enable, commands):
with telnetlib.Telnet(ip) as telnet:
telnet.read_until(b"Username")
telnet.write(to_bytes(username))
telnet.read_until(b"Password")
telnet.write(to_bytes(password))
index, m, output = telnet.expect([b">", b"#"])
if index == 0:
telnet.write(b"enablen")
telnet.read_until(b"Password")
telnet.write(to_bytes(enable))
telnet.read_until(b"#", timeout=5)
telnet.write(b"terminal length 0n")
telnet.read_until(b"#", timeout=5)
time.sleep(3)
telnet.read_very_eager()
result = {}
for command in commands:
telnet.write(to_bytes(command))
output = telnet.read_until(b"#", timeout=5).decode("utf-8")
result[command] = output.replace("rn", "n")
return result

if __name__ == "__main__":
devices = ["1.1.1.1"]
commands = ["sh ip int br"]
for ip in devices:
result = send_show_command(ip, "username", "password", "", commands)
pprint(result, width=120)

此代码返回登录错误(凝固汽油弹库(:

from napalm import get_network_driver
from pprint import pprint

driver = get_network_driver('ios')
conn_method = {'port': 23, 'transport': 'telnet', 'global_delay_factor': 2, 'secret': ''}
host = '1.1.1.1'
user = 'username'
passwd = 'password'

with driver(hostname=host, username=user, password=passwd, optional_args=conn_method ) as device:
print('Getting facts')
pprint(device.get_facts())

此代码返回登录错误(netmiko库(:

import os
from netmiko import ConnectHandler
switch = {
'device_type': 'cisco_ios_telnet',
'ip': '1.1.1.1',
"username": "username",
"password": "password",
"timeout": 15
}
net_connect = ConnectHandler(**switch)
print(net_connect)

正如您已经提到的,NAPALM使用telnetlib进行telnet连接。但它是在CCD_ 3的帮助下使用的。

关于你的问题,这个问题可能是由于一些因素引起的:

  1. 连接超时
  2. 身份验证超时

尝试在conn_method变量中添加conn_timeout: 30auth_timeout: 30(例如30秒(,以便为应用程序连接和验证网络设备留出时间。

还建议将fast_cli设置为False(默认值为True(。fast_cli简单地将延迟因子乘以0.1。因此,如果延迟因子为1(100秒(,这意味着应用程序只有10秒的时间来屏幕抓取远程网络设备上发生的事情,在某些情况下这并不总是足够的此行为仅适用于使用CiscoBaseConnection的情况

对于BaseConnectionfast_cli的默认值为False

这是您的案例的完整工作演示

from pprint import pprint
from napalm import get_network_driver
driver = get_network_driver("ios")
creds = {
"hostname": "192.168.1.150",
"username": "cisco",
"password": "cisco",
}
optionals = {
"transport": "telnet",  # no need for port 23. It implicilty knows what port to set
"secret": "", 
"conn_timeout": 30,
"auth_timeout": 30,
"fast_cli": False,  # no need for global_delay_factor now in case of get_facts() only
}

with driver(**creds, optional_args=optionals) as device:
print("Port:", device.device.port)  # prints 23
print("Parsing facts...")
facts = device.get_facts()
pprint(facts)

相关内容

  • 没有找到相关文章

最新更新