Интерактивные скрипты telnet, ftp и др

logoСегодня речь пойдет о замечательной команде expect. Применение expect в первую очередь связано с управлением интерактивными приложениями, которые требуют от пользователя ввода данных, таких как ftp, telnet, ssh и др. Если программе expect указать, что именно отвечать на задаваемые вопросы, то по этому списку ответов программа будет выполнять все действия, которые вы ей зададите. Сайт программы expect http://expect.nist.gov/. Первым делом идете на сайт и ознакомьтесь с теми возможностями, что умеет эта программа. А возможности у нее богатые.

Любой интерактивный скрипт на expect должен начинаться со строк


#!/usr/bin/expect -f

А теперь рассмотрим простейшие примеры команд по автоматизации telnet комманд.
1 пример – бэкапим конфигурацию коммутатора к себе на компьютер. Первым делом необходимо вручную прогнать те действия, которые мы хотим автоматизировать.
показать


Для выполнения этих же самых действий используем expect. Создаем файл с правами исполнения 700 и к примеру названием backup_m40. Почему 700, а не 755? Да потому что в данном скрипте будет сохранен пароль от устройства в открытом текстовом виде, поэтому подумайте над безопасность этого скрипта и спрячьте его подальше от любопытных глаз. Мой совет в папку /root/bin.


#!/usr/bin/expect -f

#отключаем вывод протокола диалога send-expect на экран
log_user 0
#выполняем telnet к  устройству
spawn telnet 192.168.15.40
#ждем приглашение "Username:" и просим expect набрать admin и нажать ввод - \r
expect "Username:" {send "admin\r"}
#тоже только вводим пароль
expect "Password:" {send "my_password\r"}
#уже авторизовались, поэтому ждем приглашения <4200G> и вводим команду backup-a
expect "<4200G>" {send "tftp 192.168.21.21 put unit1>flash:/3comoscfg.cfg m40.cfg\r"}
#включаем вывод протокола диалога send-expect на экран, чтобы посмотреть чем закончился скрипт
log_user 1
#выходим из устройства
send "quit\r"
#завершаем работы expect
expect eof

Вот что мы увидим, когда выполним backup_m40


root@mik:~/bin/backup# ./backup_m40
 put unit1>flash:/3comoscfg.cfg m40.cfg
  File will be transferred in binary mode.
  Copying file to remote tftp server. Please wait... /
  TFTP:     9572 bytes sent in 0 second(s).

  File uploaded successfully.

<4200G>quitConnection closed by foreign host.

Значит все в порядке и скрипт работает, можно поставить скрипт на ежесуточное выполнение для backup конфигурации устройства.

Пример 2, немного посложнее. В данном примере мне необходимо было мониторить температуру в серверной. В качестве датчика температуры был внешний датчик на одном из ИБП (источнок бесперебойного питания). ИБП управлялся через web и telnet интерфейсы. Также, можно было получать данные через snmp, но к моему большому сожаления температура не передавалась. Пришлось использовать expect, чтобы добраться до температуры. Был сделан скрипт с названием apc1000_get_telnetprobetemp, с листингом


#!/usr/bin/expect -f

log_user 0
spawn telnet 192.168.0.3
expect "User Name :" {send "admin\r"}
expect "Password  :" {send "my_password\r"}
#чтобы добраться до температуры ходим по меню цифрами 1-2-1
expect ">" {send "1\r"}
expect ">" {send "2\r"}
expect ">" {send "1\r"}
#получили температуру и требуется выйти из telnet
#а вот тут 3 раза \033 эта последовательность обозначает ESC.
#Т.к. других способов выйти из меню ИБП нет
expect ">" {send "\033\r"}
expect ">" {send "\033\r"}
expect ">" {send "\033\r"}
expect ">" {send "4\r"}
log_user 1
send "exit\r"
expect eof

В итоге запустив скрипт получим:
показать


Хоть мы температуру и узнали, но в таком большом выводе команды тяжеловато разбираться, поэтому сделаем еще один скрипт такого содержания


#!/bin/sh
#вычленяем только температуру из всего листинга скрипта expect
/root/bin/apc1000_get_telnetprobetemp | grep "Sensor 1" | awk '{print $4}'

А вот результат скрипта, который уже можно привязать к ежедневной отправке к примеру по email. Или строить графики колебания температур, через программу rrdtool.


root@gw:~/bin# ./apc1000_get_temp
35.5

Аналогично можно сделать интерактивные скрипты ко многим приложениям или устройствам. Например, как вариант, ребутить adsl (lan) модем (роутер) по неответу провайдерского шлюза, мониторить загрузку процессора устройства ну и т.д.
Про более продвинутое применение expect скриптов можно прочитать тут и тут.

Запись опубликована в рубрике Программы с метками , , , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *