Необходимо перенаправить ввод из файла, а также с tty

Необходимо перенаправить ввод из файла, а также с tty

Я использую 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__

Связанный контент