Netmiko не находит подсказку при вводе баннера exe c для устройств cisco IOS - PullRequest
0 голосов
/ 07 февраля 2020

Привет, сообщество Stackoverflow!

Netmiko не был стабильным для меня сегодня, поэтому я решил обновить его до версии 3.0.0. Хотя его стабильность возросла, я заметил, что больше не могу отправлять баннеры exe c строк на устройства cisco. Вчера я смог успешно развернуть это на почти 100 устройствах.

Вот упрощенная версия кода, который я устраняю.

    import threading
    import time
    import re
    import pdb
    import difflib
    from netmiko import NetMikoAuthenticationException
    from netmiko import ConnectHandler
    from datetime import datetime
    import logging
    logging.basicConfig(filename='test.log', level=logging.DEBUG)
    logger = logging.getLogger("netmiko")


    class MyThread(threading.Thread):

        def run(self):
            date = datetime.now()
            date_file = date.strftime("%Y-%b-%d_%H%M%S")
            print("{} started!".format(self.getName()))
            IP = self.getName().split(" ")[-1]

            my_device = {
                "host": IP,
                "username": "cisco_ios_user",
                "password": "cisco_ios_pwd",
                "device_type": "cisco_ios",
                "secret": "cisco_ios_pwd"
            }

            try:

                print("--- Connecting to device " + IP)
                net_connect = ConnectHandler(**my_device)
                net_connect.enable()
                hostname = net_connect.find_prompt().rstrip(">").rstrip("#").rstrip(">t")
                print("        Connected to " + hostname)
                location = "Central_1"
                serial = "FTX0945W0MY"

                config = ""
                #config = config + "\n!"
                config = config + "\nbanner exec ^"
                config = config + "\nSite Location: " + location
                config = config + "\nHostname: " + hostname
                config = config + "\nModel: 3725"
                config = config + "\nChassis Serial Number: " + serial
                config = config + "\nAsset: None"
                config = config + "\n^"
                config = config + "\n"

                print("Config is:" + config)

                log = net_connect.send_config_set(config)
                print(log)

                for line in config.splitlines():
                    print(line)


                print("{} finished!".format(self.getName()))




            except NetMikoAuthenticationException:
                print("ERROR for " + IP + ": Authentication Error @ " + date_file)
                print('# ' * 40 + "\n")
                f = open("run_summary.txt", "a")
                f.write("\n" + "unknown, " + IP + ", " + "AuthenticationError, " + date_file)
                f.close()





    def main():
        with open('inventory.txt') as IP_LIST:
            for IP in IP_LIST:
                IP = IP.rstrip("\n")
                my_thread = MyThread(name="Script for device {}".format(IP))
                my_thread.start()
                time.sleep(300)


    if __name__ == '__main__':
        main()

Вывод:

    --- Connecting to device 192.168.163.101
            Connected to R1_Router
    Config is:
    banner exec ^
    Site Location: Central_1
    Hostname: R1_Router
    Model: 3725
    Chassis Serial Number: FTX0945W0MY
    Asset: None
    ^

    Exception in thread Script for device 192.168.163.101:
    Traceback (most recent call last):
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\channel.py", line 699, in recv
        out = self.in_buffer.read(nbytes, self.timeout)
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\buffered_pipe.py", line 164, in read
        raise PipeTimeout()
    paramiko.buffered_pipe.PipeTimeout

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 541, in _read_channel_expect
        new_data = self.remote_conn.recv(MAX_BUFFER)
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\paramiko\channel.py", line 701, in recv
        raise socket.timeout()
    socket.timeout

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 926, in _bootstrap_inner
        self.run()
      File "C:/Users/user/PycharmProjects/untitled/network modules/2020-02-01 - Threading/multiline send_config.py", line 54, in run
        log = net_connect.send_config_set(config)
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 1726, in send_config_set
        new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 618, in read_until_pattern
        return self._read_channel_expect(*args, **kwargs)
      File "C:\Users\user\PycharmProjects\untitled\venv\lib\site-packages\netmiko\base_connection.py", line 552, in _read_channel_expect
        "Timed-out reading channel, data not available."
    netmiko.ssh_exception.NetmikoTimeoutException: Timed-out reading channel, data not available.

Я отладил это, и похоже, что он ожидает приглашения R1_Router #. Возможно, он не получает ожидаемое приглашение, потому что после ввода «banner exe c ^» в ответ на приглашение «Введите текстовое сообщение. Заканчивается символом« ^ ».» , Но я могу ошибаться или это может быть красная сельдь.

    DEBUG:netmiko:_read_channel_expect read_data: R1_Router(config)#
    DEBUG:netmiko:Pattern found: # 

    R1_Router(config)#
    DEBUG:netmiko:write_channel: b'banner exec ^\n'
    DEBUG:netmiko:Pattern is: banner\ exec\ \^
    DEBUG:netmiko:_read_channel_expect read_data: b
    DEBUG:netmiko:_read_channel_expect read_data: anner exe
    DEBUG:netmiko:_read_channel_expect read_data: c ^

    Enter TEXT message.  End with the character '^'.


    DEBUG:netmiko:Pattern found: banner\ exec\ \^ banner exec ^

    Enter TEXT message.  End with the character '^'.


    DEBUG:netmiko:Pattern is: (?:R1_Router|#)

Не уверен, что причиной является обновление пакета netmiko. Моя версия paramiko в настоящее время 2.6.0 и есть 2.7.1 доступная, но я еще не пробовал это. Мы будем благодарны за любые мысли о том, как это можно решить. Заранее спасибо. :)

1 Ответ

0 голосов
/ 09 февраля 2020

Это, вероятно, эта проблема:

https://github.com/ktbyers/netmiko/issues/1531

Вам нужно будет использовать Netmiko 2.4.2, пока я не исправлю это. Надеюсь, через неделю или две я смогу получить исправление в ветке разработки.

...