Автоматизация с помощью expect
Типичная ситуация: в офисе есть сетевой принтер, который расположен на другом этаже, мне звонят и говорят, что он "начал плеваться бумагой", ясное дело, что очередь забилась, чтобы не идти на другой этаж можно подключиться к принтеру по telnet и очистить очередь печати, но каждый раз вводить логин, пароль и команды уж очень не хочется, хочется максимально сократить телодвижения. Вот об этом и пойдет речь в этом посте на примере ftp и telnet сессий.
Для таких целей есть замечательная утилитка, имя которой expect. Работает она просто: ждет приглашения ввода и, когда дожидается, посылает заданную команду.
Ниже приведу два примера для telnet и ftp сессий, с подробными комментариями, так чтож сможет разобраться даже новичек.
telnet сессия:
#!/usr/bin/expect -f
# $remote_server - сервер, к которому осуществляется доступ
# $my_user_id - имя пользователя на сервере
# $my_password - пароль пользователя на сервере
# $my_command - команда, которая будет запущена на сервере
# Отключаем вывод, чтобы не мешался
log_user 0
# Открываем telnet сессию на удаленном сервере
spawn telnet $remote_server
# Дожидаемся запроса имени пользователя и посылаем имя пользователя
expect "Username :" {send "$my_user_id\r"}
# Дожидаемся запроса пароля и посылаем его
expect "Password :" {send "$my_password\r"}
# Дожидаемся приглашения ввода командного интерпретатора и посылаем нашу команду
expect "{Administrator}=>" {send "$my_command\r"}
# Включаем вывод, нам же нужен результат работы нашей команды :)
log_user 1
# Завершаем сессию telnet
send "exit\r"
# Ждем символа конца строки (eof)
expect eof
ftp сессия:
#!/usr/bin/expect -f
# remote_server - сервер, к которому осуществляется доступ
# my_user_id - имя пользователя на сервере
# my_password - пароль пользователя на сервере
# my_command - команда, которая будет запущена на сервере
# Отключаем вывод, чтобы не мешался
log_user 0
# Открываем ftp сессию на удаленном сервере
spawn ftp $remote_server
# Дожидаемся запроса имени пользователя и посылаем имя пользователя
expect "username:" {send "$my_user_id\r"}
# Дожидаемся запроса пароля и посылаем его
expect "password:" {send "$my_password\r"}
# Ждем приглашения ввода ftp и переключаемся в бинарный режим
expect "ftp>" {send "bin\r"}
# Дожидаемся следующего приглашения ввода ftp и посылаем нашу команду
expect "ftp>" {send "$my_command\r"}
# Включаем вывод, нам же нужен результат работы нашей команды :)
log_user 1
# Завершаем сессию ftp
send "bye\r"
# Ждем символа конца строки (eof)
expect eof
На этом все :)
Надеюсь этот небольшой пост поможет не раз сэкономить тебе время, силы и нервы :)