Opis sytuacji:
Gdzieś na ziemi w dziwnych lokalizacjach znajduje się ok 80 routerów cisco 800. Wszystkie skonfigurowane w bardzo podobny sposób "z palca". Brak narzędzia do automatycznego zarządzania. Możliwe jest tylko zarządzanie via Secure Shell.
Cel:
Zautomatyzowanie logowanie do urządzeń po przez ssh wraz z akceptacją klucza oraz wprowadzania zmian w konfiguracji.
Przez kilka tygodni zastanawiałem się jak to osiągnąć bez zakupu wyspecjalizowanego oprogramowania.
Po długich poszukiwaniach okazało się, iż do moich celów doskonale nadaje się to co mam pod ręką - czyli system Linux z zainstalowanymi dodatkowymi pakietami. Dodatkowo znalazłem pewien skrypt jednak nie spełniał on moich oczekiwań wiec go odrobinę poprawiłem.
Co jest potrzebne:
Skrypt potrafi połączyć się z urządzeniem, jeśli w pliku know_hosts nie znajdzie klucza publicznego routera to go zaakceptuje. W kroku następnym wyśle hasło, wprowadzi polecenie enable i wprowadzi odpowiednie hasło. Następnie wykona polecenie przekazane jako ostatni parametr i zakończy sesje. W przypadku jeśli jako ostatni parametr podamy spacje ujętą w " " skrypt pozowoli manualnie wporwadzić dowolną liczbę poleceń.
Skypt wygląda mniej wiecej tak:
#!/usr/bin/expect -f
if {[llength $argv] != 5} {
puts "usage:"
# 0 1 2 3 4
puts "./ciscoManualConnect <ip/hostname> <user> <pass> <enpass> <command> "
exit
}
set ip [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set enpass [lindex $argv 3]
set cmd [lindex $argv 4]
set timeout 10
log_user 0
spawn ssh ${user}@${ip}
expect "(yes/no)?" {send "yes\n"} \
expect {*Password:*} {}\
timeout {puts "\nWaiting for login prompt\n" }
send ${pass}\r
expect {*Password:*} {puts "\nBad password\n"; exit} \
{*>} {} \
timeout {puts "\nWaiting for login prompt\n" }
send "enable\r"
expect assword:
send -- ${enpass}\r
expect {*ccess denied} {puts "\nBad enable password\n"; exit} \
{*#} {} \
timeout {timedout waiting for login prompt}
send ${cmd}
log_user 0
send \r
send exit\r
send exit\r
send exit\r
send exit\r
interact
exit 0
Użycie skryptu:
Zakładając iż powyższy skrypt zapiszemy w pliku ciscoManualConnect i nadamy mu odpowiednie uprawnienia, wywołujemy go w następujący sposób.
./ciscoManualConnect "$WanIP" "$Login" "$UsrPwd" "$EnPwd" "$Command"
Dodanie do tego odpowiednio przygotowanej bazy danych (w sumie jedna tabela w MySQL) kilka drobnych funkcji i mamy gotowy automat do wygodnego zarzaądzania dowolną liczbą urządzeń.
Gdzieś na ziemi w dziwnych lokalizacjach znajduje się ok 80 routerów cisco 800. Wszystkie skonfigurowane w bardzo podobny sposób "z palca". Brak narzędzia do automatycznego zarządzania. Możliwe jest tylko zarządzanie via Secure Shell.
Cel:
Zautomatyzowanie logowanie do urządzeń po przez ssh wraz z akceptacją klucza oraz wprowadzania zmian w konfiguracji.
Przez kilka tygodni zastanawiałem się jak to osiągnąć bez zakupu wyspecjalizowanego oprogramowania.
Po długich poszukiwaniach okazało się, iż do moich celów doskonale nadaje się to co mam pod ręką - czyli system Linux z zainstalowanymi dodatkowymi pakietami. Dodatkowo znalazłem pewien skrypt jednak nie spełniał on moich oczekiwań wiec go odrobinę poprawiłem.
Co jest potrzebne:
- klient ssh ;
- powłoka GNU Bourne-Again SHell - czyli po prostu bash;
- interpreter jezyka tcl - czytaj expect.
Skrypt potrafi połączyć się z urządzeniem, jeśli w pliku know_hosts nie znajdzie klucza publicznego routera to go zaakceptuje. W kroku następnym wyśle hasło, wprowadzi polecenie enable i wprowadzi odpowiednie hasło. Następnie wykona polecenie przekazane jako ostatni parametr i zakończy sesje. W przypadku jeśli jako ostatni parametr podamy spacje ujętą w " " skrypt pozowoli manualnie wporwadzić dowolną liczbę poleceń.
Skypt wygląda mniej wiecej tak:
#!/usr/bin/expect -f
if {[llength $argv] != 5} {
puts "usage:"
# 0 1 2 3 4
puts "./ciscoManualConnect <ip/hostname> <user> <pass> <enpass> <command> "
exit
}
set ip [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set enpass [lindex $argv 3]
set cmd [lindex $argv 4]
set timeout 10
log_user 0
spawn ssh ${user}@${ip}
expect "(yes/no)?" {send "yes\n"} \
expect {*Password:*} {}\
timeout {puts "\nWaiting for login prompt\n" }
send ${pass}\r
expect {*Password:*} {puts "\nBad password\n"; exit} \
{*>} {} \
timeout {puts "\nWaiting for login prompt\n" }
send "enable\r"
expect assword:
send -- ${enpass}\r
expect {*ccess denied} {puts "\nBad enable password\n"; exit} \
{*#} {} \
timeout {timedout waiting for login prompt}
send ${cmd}
log_user 0
send \r
send exit\r
send exit\r
send exit\r
send exit\r
interact
exit 0
Użycie skryptu:
Zakładając iż powyższy skrypt zapiszemy w pliku ciscoManualConnect i nadamy mu odpowiednie uprawnienia, wywołujemy go w następujący sposób.
./ciscoManualConnect "$WanIP" "$Login" "$UsrPwd" "$EnPwd" "$Command"
Dodanie do tego odpowiednio przygotowanej bazy danych (w sumie jedna tabela w MySQL) kilka drobnych funkcji i mamy gotowy automat do wygodnego zarzaądzania dowolną liczbą urządzeń.
Brak komentarzy:
Prześlij komentarz