Tamkovich.com: Телеком/VoIP блог
Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys
Имитация действий пользователя в командной строке с помощью утилиты expect
25 октября, 2013 by rius
Linux, Программирование shellНа днях возникла необходимость подобной автоматизации. Для самых простых случаев — скажем, когда от пользователя требуется простой ввод «y» на какой-то вопрос — сгодится и утилита yes:
yes | cp /dev/null /var/opt/some.log |
Данная команда сотрет содержимое файла some.log без вмешательства пользователя, т.к. он он уже ответил «y» еще до вопроса :) Но есть более сложные сценарии, когда функциональности yes недостаточно. В таких случаях нужно использовать expect. На вход команде подается специальный expect файл. Тестовый скрипт sample_input_script.pl, для которого имитируется пользовательский ввод:
#!/usr/bin/perl print "Are you sure you want to proceed?(Type YES) "; chomp ($choice = <>); if ($choice ne "YES") {die "Exiting";} print "How old are you? "; chomp ($age = <>); print "WOW! You are $age years old!\n"; |
Expect-файл sample.exp:
#!/usr/bin/expect -f spawn /home/dk/sample_input_script.pl expect "Are you sure you want to proceed?(Type YES) " sleep 5 send "YES\n" expect "How old are you*" sleep 5 send "22\n" interact |
Немного комментариев.
В строке spawn … задается команда, ввод в которую мы хотим имитировать. Этой команды не существует в виде отдельной утилиты (но есть куча вопросов в интернете — почему spawn выдает «command not found» и в каком пакете она ставится). Задержки по пять секунд поставлены на всякий случай. Строка в первом expect введена с точностью до буквы в таком же виде, как она включена в perl скрипт. Во втором expect используется звездочка, которая заменяет подстроку «? » из perl скрипта. Запуск осуществляется так:
expect sample.exp
Linux, Программирование shell