вторник, 5 ноября 2013 г.

Expect



Expect - очень удобное средство для автоматизации управления, в моем случае маршрутизаторами по telnet.

Запускаем под Windows
  1. Загружаем Active Tcl с http://www.activestate.com/activetcl/downloads/
  2. Устанавливаем (Обычно c:/Tcl/ directory)
  3. Переходим в папку Bin в командной строке (Start > Run > commad > cd c:\Tcl\bin)
  4. При работе через прокси нужна будет команда teacup proxy (например teacup proxy myproxy.com 8080). Если не работает можно установить переменные среды:
     set http_proxy=http://proxyhost:80/
     set http_proxy_user=NTDOMAIN\username
     set http_proxy_pass=yourpassword
  5. Вводим команду для установки Expect:  teacup install Expect (если не удается установить может помочь команда teacup update)
Для того чтобы файлы Expect запускались под Windows в файл следует добавить следующий заголовок:

#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
package require Expect

Для того чтобы запустить скрипт вводим следующую команду:

c:\tcl\bin\> tclsh85 myscirpt.tcl

Можно запускать внешние команды, используя команду spawn:
spawn ssh myserver.com 
send -- "someting\r"  -  Отправить команду и нажать "Enter"
expect -- ">"  - Ждать появления символа  ">"
  

Еще примеры можно найти на http://en.wikipedia.org/wiki/Expect

Примеры:


Telnet login:

#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
package require Expect
spawn telnet 172.20.0.125
expect "Password: "
send  "cisco\r"
expect ">"
send "en\r"
expect "Password: "
send  "cisco\r"
expect "#"
send "show clock\r"
expect "#"
send "exit\r"
expect eof   #всегда добавляем в конце скрипта          

Цикл (телнет на маршрутизаторы по списку:
#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
package require Expect
foreach address {
172.19.0.31
172.19.0.32
} {
Sleep 5                       #ждем 5 секунд. Без этой команды может не подцепиться к следующему устройству
send "telnet $address /source-interface l0\r"
expect "Password: "
send  "cisco\r"
expect ">"
send  "exit\r"
}
expect eof

Массив:


set password(0) "sample"
set password(1) "test"
set password(2) "pswd"
set password(3) "getsome"
set password(4) "yeah"
set num_passwd [array size password] #объявляем переменную со
                                     #значением, равным числу
                                     #элементов массива
....
set count 0
....
        while {$count<$num_passwd} {
             expect "*assword:" {
                        send $password($count)\r}
                incr count
        }
    ....
}

Материалы взяты из следующих источников: 
http://news.hping.org/comp.lang.tcl.archive/0062.html
Donn Libes "Exploring Expect"  (O'Reilly, 1994)

Комментариев нет:

Отправить комментарий