
Я использую Amanda для своих резервных копий. Мне нужно восстановить кучу файлов с разных дат. У файлов одинаковые имена, поэтому мне нужно сделать несколько сеансов восстановления. Поэтому я подумал, что напишу скрипт. Вот мой скрипт:
sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract
Я запускаю скрипт, используя перенаправление оболочки:
amrecover my_Config < /home/me/thatScript
Проблема в том, что как только amrecover увидитизвлекатькоманду, он просит меня подтвердить.
Continue? [Y/n]:
Ввод "Y" в строку после "extract" не работает. Amrecover сидит там и ждет, пока я наберу "Y". Я думаю, amrecover хочет получить входные данные с tty, а не только со stdin.
Я посмотрел на man-страницу для amrecover, а также я гуглил, чтобы посмотреть, разобрался ли кто-нибудь с этим. И код скомпилирован, поэтому я не могу взломать скрипт, чтобы не ждать подтверждения.
Есть ли способ принимать входные данные из скрипта и перенаправлять /dev/tty на stdin?
решение1
amrecover
предназначен для интерактивного скрипта, поэтому традиционно для его автоматизации можно использовать expect
. Эту tcl
утилиту можно заставить проверять разговор на наличие двух стилей подсказок ( amrecover>
и Continue? [Y/n]:
) и отвечать на них по-разному. Например, создайте файл myrecover
в вашем PATH, сделайте его исполняемым ( chmod +x myrecover
) и поместите в него следующее:
#!/usr/bin/expect
spawn amrecover my_Config
expect -ex {Continue? [Y/n]:} { send "y\r"; exp_continue } \
-ex {amrecover>} { gets stdin input;
if ![eof stdin] { send $input; send "\r"; exp_continue } }
close
wait
Затем запустите его как
./myrecover </home/me/thatScript
Скрипт expect
разветвляется и запускает вашу команду amrecover my_Config
, подключаясь к ней через pty, затем слушает ввод в поисках двух приглашений. Когда amrecover>
появляется обычное приглашение, мы считываем строку из stdin скрипта expect
, т. е. ваш набор команд, и (если мы не получили конец файла) отправляем эту строку в программу с новой строкой ( \r
преобразуется в это). Это exp_continue
заставляет команду снова зацикливаться для следующего совпадения приглашения. При достижении конца файла мы закрываем соединение с программой и ждем ее выхода.
Помните, что amanda
такой подход может вызвать сбой, если запрос на продолжение выдается при возникновении какой-либо исключительной ситуации и т. д.
решение2
Предоставьте входные данные утилите, как показано extract
на рисунке heredoc
:
extract - <<\__DATA__
Y
__DATA__