#!/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))
|
Powered by TurnKey Linux.