2010-12-20

Expect

Előfordul, hogy nincs jobb megoldás a kézi vezérlésnél, mert a központi management eszközben nincs olyan opció, amire szükségünk lenne, vagy van ugyan valami hasonló, de nem pontosan azt csinálja. Ilyenkor aztán marad az SSH, Telnet, command line. Viszont ha sok eszközön kell ugyanazt bepötyögni, hát, az bizony lélekölő feladat, nem is szívesen kezdek ilyesmibe. Helyette jöhet az Expect. Ez egy remek kis linuxos program, amivel bármilyen parancssoros interaktív kommunikációt le lehet szkriptelni, készíthetünk elágazásokat, használhatunk változókat, meghívhatunk külső programokat, igazi svájci bicska.

További magyarázatok helyett álljon itt egy példa, amely bejelentkezik Linux alól egy Cisco eszközre SSH-n keresztül (spawn ssh -l $ap_user $ap_ip) és beállít ezt-azt. Ha még soha nem jelentkeztünk be erre az eszközre, akkor ugye meg kell erősítenünk, hogy tényleg elfogadjuk azt az RSA kulcsot, amit az SSH szerver küld a kliensünk számára, viszont ilyesmire csak az első bejelentkezésnél kér minket az SSH kliens, minden további bejelentkezésnél a szerver RSA kulcsát a saját kis "known_hosts" fájljában lévő kulccsal veti össze, és nem kérdez alapból semmit. A kilencedik sor ezt a helyzetet kezeli le, küld egy "yes"-t, ha még nem látott ilyen RSA kulcsot, ellenkező esetben pedig csendben timeoutol az ötödik másodperc után és folytatja a következő sorral. Maga a konfiguráció egyébként, amit a szkript elvégez, az egy új, "minta" nevű SNMPv3 user felvétele a "MINTAcsoport" nevű SNMPv3 group-ba, illetve a hozzá tartozó jelszó beállítása, majd a teljes konfiguráció mentése:

#!/usr/bin/expect

set ap_user [lindex $argv 0]
set ap_pass [lindex $argv 1]
set ap_ip [lindex $argv 2]
set timeout 5

spawn ssh -l $ap_user $ap_ip
expect "Are you sure" { send "yes\r"} timeout {}
expect "password:"
send "$ap_pass\r"
expect "#"
send "conf t\r"
expect "(config)#"
send "snmp-server user minta MINTAcsoport v3 auth md5 MINTAjelszo\r"
expect "(config)#"
send "exit\r"
expect "#"
send "copy run start\r"
expect "Destination"
send "\r"
expect "#"
send "exit\r"
expect "closed"
A kódból látható, hogy ezt a szkriptet változókkal kell meghívni, a szkript neve után meg kell adnunk az admin user nevét, jelszavát, majd azt az IP-t is, ahová be szeretnénk jelentkezni. Ez a megoldás jelentősen megkönnyíti az expect szkriptünk ciklusból való meghívását, így ugyanis könnyen fabrikálhatunk olyan shell szkriptet köré, amivel minden adminisztrálandó eszközünkön el tudjuk végezni a kérdéses feladatot.

Nincsenek megjegyzések:

Megjegyzés küldése