我尝试使用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的帮助下使用的。
关于你的问题,这个问题可能是由于一些因素引起的:
- 连接超时
- 身份验证超时
尝试在conn_method
变量中添加conn_timeout: 30
和auth_timeout: 30
(例如30秒(,以便为应用程序连接和验证网络设备留出时间。
还建议将fast_cli
设置为False
(默认值为True
(。fast_cli
简单地将延迟因子乘以0.1。因此,如果延迟因子为1(100秒(,这意味着应用程序只有10秒的时间来屏幕抓取远程网络设备上发生的事情,在某些情况下这并不总是足够的此行为仅适用于使用CiscoBaseConnection
的情况
对于
BaseConnection
,fast_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)