#!/usr/bin/python # coding=utf-8 import paramiko import time import sys def get_data(host, user, password, commands): # вытаскиваем из циски данные errorcode = '' client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # если нет хоста - добавляем out = [] # выхлоп будет в этом списке try: client.connect(hostname=host, username=user, password=password, look_for_keys=False, allow_agent=False) # пытаемся подключиться, look_for_keys=False, allow_agent=False - зачем-то нужны циске. except Exception as exept: # в случае исключения - errorcode = exept # возвращаем код и описание исключения else: # усли все в порядке conn = client.invoke_shell() # врубаем интерактивный шелл - с цисками только так. time.sleep(1) # задержка conn.recv(1000) # хаваем все, что выплюнула цика, дабы не отсвечивало for command in commands: # Читаем и исполняем команды if command[0] == "$username": command[0] = user if command[0] == "$password": command[0] = password conn.send(command[0] + '\n') # засылаем команду time.sleep(int(command[1])) # ждем указанный таймаут if command[2]: # если сказано сохранять - сохраняем выхлоп conn_out = conn.recv(99999999999).splitlines() # жрем выхлоп в список, разбивая по строкам out_line = "" # пустая строка для сохранения if len(conn_out) > 2: conn_out.pop() # обрезаем последнюю строку строку conn_out.pop(0) # Обрезаем первую строку if command[3]: # если сказано комментить - комментим for line in conn_out: # перебираем все строки line = "!" + line # Добавляем в начало ! out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную else: # Если не сказано коментить - не коментим for line in conn_out: # перебираем все строки out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную out.append(out_line) # Добавляем все толпой в выхлоп else: # если выхлоп нам ненужон conn.recv(99999999999) # хаваем его в никуда finally: # по окончании всех процедур client.close() # закрываем коннектий return out, errorcode # Вертаем все, что наковыряли def read_file(in_file): errorcode = "" # устанавливаем переменные out = [] try: # Пробуем открыть файл f = open(in_file, 'r') except Exception as exept: errorcode = exept # не получилось - запиливаем исключение else: # Если все норм - начинаем читать for line in f: # Каждую линию sp_line = line.split(',') # бомбим линию по разделителю в переменную command = [] # устанавливаем список, в котором будет храниться команда с атрибутами if len(sp_line) > 0: # если элементов больше 0 command.append(sp_line[0]) # добавляем элемент в список (это будет команда) if len(sp_line) > 1: # если больше одного if sp_line[1].strip().isdigit(): # если 1-й элемент из цыфарок command.append(int(sp_line[1].strip())) # добавляем цыфарку, это таймаут else: # если не цыфарки command.append("1") # то таймаут - 1 секунд if len(sp_line) > 2: # если более 2 if sp_line[2].strip() == "0" or sp_line[2].strip() == "False": # 2 элемент равен фалсе или 0 command.append(False) # добавляем фалсе else: # если там чтой-то другое command.append(True) # добавляем трую if len(sp_line) > 3: # если элементов больше 3 if sp_line[3].strip() == "0" or sp_line[3].strip() == "False": # 3 элемент равен фалсе или 0 command.append(False) # добавляем фалсе else: # если там чтой-то другое command.append(True) # добавляем трую if 0 < len(command) < 4: # если элементов не хватает, добиваем фалсой for i in [0, 1, 2, 3]: try: command[i] except IndexError: command.append(False) out.append(command) return out, errorcode # вертаем, что наковыряли def arg_parse(args): # парсим коммандную строку user = "" # устанавливаем переменные password = "" cmdfile = "" host = "" errorcode = "" for arg in args[1:]: # Перебираем элементы, присваивая списку все подряд if "\"" in arg or "\'" in arg: # обрезаем кавычки, если есть arg = arg[1:-1] sp_arg = arg.split("=") if sp_arg[0].strip() not in ["host", "user", "password", "cmdfile"]: errorcode = errorcode + " " + arg + " Недопустимый аргумент, допустимые аргументы:" \ "user=, host=, password=, cmdfile=" elif sp_arg[0].strip() == "user": user = sp_arg[1].strip() elif sp_arg[0].strip() == "password": password = sp_arg[1].strip() elif sp_arg[0].strip() == "host": host = sp_arg[1].strip() elif sp_arg[0].strip() == "cmdfile": cmdfile = sp_arg[1].strip() if str(user) == "": # дальше все подряд ясно errorcode = errorcode + "пользователь пустой " if str(password) == "": errorcode = errorcode + "пароль пустой " if str(cmdfile) == "": errorcode = errorcode + "не указан cmdfile " if str(host) == "": errorcode = errorcode + "хост пустой " return user, password, host, cmdfile, errorcode if __name__ == '__main__': user = '' host = '' password = '' cmdfile = '' errorcode = '' if len(sys.argv) > 1: user, password, host, cmdfile, errorcode = arg_parse(sys.argv) commands, errorcode = read_file(cmdfile) if errorcode: exit(errorcode) try: commands except NameError: commands = [['login', 0, False, True], [user, 0, False, True], [password, 0, False, True], ['terminal pager 0', 1, False, True], ['show version', 5, True, True], ['show flash', 5, True, True], ['show configuration', 10, True, False]] output, errorcode = get_data(host, user, password, commands) if errorcode == "0": for out in output: print out else: print("errorcode = " + str(errorcode))