Написал небольшой скрипт как пример массовой настройки маршрутизаторов Cisco по ssh на python.
Использовал paramiko, а не модуль clogin из rancid, потому что было интересно уменьшить зависимости.
От других подобных скриптов мне кажется отличает такое
1) за счет ожидания wait for string работает и на каналах с большой латентностью (спутниках и наземных в перемешку)
2) в тоже время за счет выноса цикла отправки и ожидания ответа в функцию код получается более-менее компактным и добавлять команды довольно просто
3) за счет getpass получается скрытый ввод пароля
4) да и вообще в скрипте не храняться учетные данные
5) так как в моем списке ip могут попадаться и неактивные устройства, то используется try и expect для вывода адресов, до которых не удалось достучаться.
Использовал paramiko, а не модуль clogin из rancid, потому что было интересно уменьшить зависимости.
От других подобных скриптов мне кажется отличает такое
1) за счет ожидания wait for string работает и на каналах с большой латентностью (спутниках и наземных в перемешку)
2) в тоже время за счет выноса цикла отправки и ожидания ответа в функцию код получается более-менее компактным и добавлять команды довольно просто
3) за счет getpass получается скрытый ввод пароля
4) да и вообще в скрипте не храняться учетные данные
5) так как в моем списке ip могут попадаться и неактивные устройства, то используется try и expect для вывода адресов, до которых не удалось достучаться.
#!/usr/bin/python #for work with SSH we need paramiko pip install paramiko import paramiko import getpass #build in library socket for with exception import socket list_bad_ip=[] client = paramiko.SSHClient() #for connection via ssh you need to accept SSH keys client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #create function for send command and check answer def send_string_and_wait_for_string(command, wait_string): #send command shell.send(command) #clear buffer receive_buffer = "" #until receive WAIT_STRING - remote device ready while not wait_string in receive_buffer: receive_buffer += shell.recv(1024) #read list of IPs from text file one by line ips = [i.strip() for i in open("./1")] username1 = raw_input("enter login :") password1 = getpass.getpass("enter password :") #create loop for each IPs for ip in ips: #if we use try easy to work with expection try: #connect to device client.connect(ip,port=22,username=username1,password=password1) #check state print "connect to ",ip shell = client.invoke_shell() #wait for enable send_string_and_wait_for_string("", "#") #enter conf t and wait for # send_string_and_wait_for_string("conf t\n", "(config)#") #enter command and wait for return to # send_string_and_wait_for_string("login on-failure log\n","(config)#") send_string_and_wait_for_string("login on-success log\n","(config)#") #end is important, exit worse in this case send_string_and_wait_for_string("end\n","#") #don't forget store in flash send_string_and_wait_for_string("wr mem\n","#") #we are near end with device print ip+" ok" #close with this device shell.close() client.close() #work with timeout error except socket.error: print ip + '=== Device unreachable' #add ip with errors to list list_bad_ip.append(ip) #save this list to file with open('bad_ip', 'w') as f: for s in list_bad_ip: f.write(s + '\n') #show list at the screen for lazy admin print list_bad_ip
Комментариев нет:
Отправить комментарий