Написал небольшой скрипт как пример массовой настройки маршрутизаторов 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
Комментариев нет:
Отправить комментарий