【问题标题】:Telnet device automationTelnet 设备自动化
【发布时间】:2021-08-20 14:56:32
【问题描述】:

我尝试使用 telnet 协议通过 python 连接到设备以进行一些自动化(例如一些旧的 Cisco 路由器), 为此,我正在使用 Napalm 库(它基于基于 telnetlib 库的 Napalm 库)

问题是当我直接使用 telnetlib 库时它工作正常,但是当我使用 Napalm 或 Netmiko 它给出了这个错误:获取 Telnet 登录失败。

以前有人遇到过这种情况吗?

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

提前谢谢你。

此代码有效(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"enable\n")
            telnet.read_until(b"Password")
            telnet.write(to_bytes(enable))
            telnet.read_until(b"#", timeout=5)
        telnet.write(b"terminal length 0\n")
        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("\r\n", "\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)

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

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)

【问题讨论】:

  • 欢迎来到 StackOverflow!为了让我们更好地帮助您,您能否更新您的问题,以便它在minimal, complete, and verifiable example 中显示您的相关代码。如果您能告诉我们到目前为止您为解决问题所做的尝试,这也会很有帮助。欲了解更多信息,请参阅how to ask good questions
  • 诸如此类的库通常提供了查看通过适当配置发送和接收的实际字节的方法。您可能需要搜索此文档。

标签: python telnet telnetlib netmiko napalm


【解决方案1】:

正如您已经提到的,NAPALM 使用telnetlib 进行远程登录连接。但它在netmiko 的帮助下使用它。

关于您的问题,可能是由于某些因素引起的:

  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)

【讨论】:

  • 感谢@Tes3awy 的帮助
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2012-05-05
  • 2010-12-02
  • 2015-05-04
  • 2015-05-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多