Python — как принять решение на основе неудачной команды (netmiko и попробуйте-кроме-другого)

#python #cisco

Вопрос:

Я пытаюсь создать тестовую программу, которая будет входить в брандмауэры Cisco ASA и собирать некоторые данные. Я сталкиваюсь с проблемой. Некоторые брандмауэры являются одноконтекстными, некоторые-многоконтекстными, но подключение ко всем из них осуществляется по IP-адресу администратора. После подключения появляется команда «изменить систему«, которая будет успешной только на многоконтекстных брандмауэрах. Я думал использовать try-кроме-другого ….

     conn = ConnectHandler(device_type= "cisco_asa", ip=host[1],  username=u[host[3]], password=p[host[3]], secret=p[host[3]])
    print(conn.find_prompt())
    try:
        output4 = conn.send_command(cmd_system)
    except:
        # not a multi-context firewall
        for cmd in cmd_list_asa:
                CONTEXT_OUTPUT = open(chgnr   '__'   host[0]   '_'   d[cmd]  '_'   testtype , "a")
                info = ("running .... "   host[0]   "......."   cmd)
                runcommand(info, cmd, CONTEXT_OUTPUT)
                CONTEXT_OUTPUT.close()
    else:
        #multi-context firewall
        #collect SYSTEM context data
        for cmd in cmd_list_asa:
                CONTEXT_OUTPUT = open(chgnr   '__'   host[0]   '_system_'   d[cmd]  '_'   testtype , "a")
                info = ("running .... "   host[0]   "_system......."   cmd)
                runcommand(info, cmd, CONTEXT_OUTPUT)
                CONTEXT_OUTPUT.close()
        #create context list and collect data
        output3 = conn.send_command(cmd_contextlist)
        list = re.findall(""(.*?)"",output3)
        for fw in list:
            cmd_change = ("changeto context "   fw)
            output = conn.send_command(cmd_change)
            for cmd in cmd_list_asa:
                CONTEXT_OUTPUT = open(chgnr   '__'   host[0]   '_'   fw   '__'   d[cmd]  '_'   testtype , "a")
                info = ("running .... "   host[0]   "_"   fw   "......."   cmd)
                runcommand(info, cmd, CONTEXT_OUTPUT)
                CONTEXT_OUTPUT.close()
 

CONTEXT_OUTPUT-это просто причудливый способ динамического создания имени файла. testype, чтобы различать несколько запусков и, наконец, все, что делает команда запуска, отправляет команду…conn.send_command(cmd).

В соответствии с моим ожиданием, если команда output4 завершится неудачно, раздел «кроме» должен быть выполнен, если он будет успешным, должен перейти в раздел «остальное», но, по-видимому, даже те брандмауэры, которые не являются многоконтекстовыми, будут проходить через раздел «остальное» и пропускать «кроме».

Ответ №1:

Поговорив с моим коллегой, я понял свою ошибку. Try-expect предназначен для обработки ошибок python. Когда команда завершается неудачно, она все равно возвращает вывод

 ...admin> changeto system
                                      ^
ERROR: % Invalid input detected at '^' marker.
ERROR: Command authorization failed
 

…этот результат должен быть оценен, поэтому вместо «попробуй-ожидай-еще» должно быть «если-еще»…

  ....
   output4 = conn.send_command(cmd_system)
        if "ERROR" in output4: 
            # not a multi-context firewall
            for cmd in cmd_list_asa:
                    CONTEXT_OUTPUT = open(chgnr   '__'   host[0]   '_'   d[cmd]  '_'   testtype , "a")
                    info = ("running .... "   host[0]   "......."   cmd)
                    runcommand(info, cmd, CONTEXT_OUTPUT)
                    CONTEXT_OUTPUT.close()
        else:
            #multi-context firewall
            #collect SYSTEM context data
            for cmd in cmd_list_asa:
....