Precisa redirecionar a entrada de um arquivo e também do tty

Precisa redirecionar a entrada de um arquivo e também do tty

Estou executando Amanda para meus backups. Preciso restaurar vários arquivos de datas diferentes. Os arquivos têm o mesmo nome, então preciso fazer várias sessões de restauração. Então, pensei em fazer o roteiro da coisa. Aqui está meu roteiro:

sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract

Eu executo o script usando redirecionamento de shell:

amrecover my_Config < /home/me/thatScript

O problema é que assim que amrecover vê oextraircomando ele me pede para confirmar.

Continue? [Y/n]:

Colocar "Y" na linha após "extrair" não funciona. Amrecover fica lá e espera que eu digite "Y". Imagino que o amrecover queira a entrada do tty e não apenas do stdin.

Eu olhei a página de manual do amrecover e também pesquisei no Google para ver se alguém descobriu isso. E o código é compilado, então não posso hackear um script para não esperar pela confirmação.

Existe uma maneira de obter informações de um script e redirecionar/dev/tty para stdin?

Responder1

amrecoverpretende ser um script interativo, portanto, tradicionalmente, para automatizá-lo, você pode usar o expect. Este tclutilitário pode ser feito para verificar a conversa em busca dos dois estilos de prompt ( amrecover>e Continue? [Y/n]:) e respondê-los de forma diferente. Por exemplo, crie um arquivo myrecoverem seu PATH, torne-o executável ( chmod +x myrecover) e coloque o seguinte nele:

#!/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

Então execute-o como

./myrecover </home/me/thatScript

O expectscript bifurca e executa seu comando amrecover my_Config, conectando-se a ele por meio de um pty e, em seguida, escuta a entrada procurando os dois prompts. Quando o prompt normal amrecover>é visto, lemos uma linha do stdin do expectscript, ou seja, seu conjunto de comandos, e (se não obtivermos o fim do arquivo) enviamos essa linha para o programa, com uma nova linha ( \ré convertido para isso). Isso exp_continuefaz com que o comando faça um loop novamente para a próxima correspondência de prompt. No final do arquivo fechamos a conexão com o programa e esperamos que ele saia.

Esteja ciente de que executar amandadesta forma pode causar estragos se o prompt de continuação for devido a alguma condição excepcional, etc.

Responder2

Forneça a entrada ao extractutilitário por meio do heredocmostrado:

extract - <<\__DATA__
Y
__DATA__

informação relacionada