#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:
....