
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
amrecover
pretende ser um script interativo, portanto, tradicionalmente, para automatizá-lo, você pode usar o expect
. Este tcl
utilitá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 myrecover
em 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 expect
script 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 expect
script, 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_continue
faz 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 amanda
desta forma pode causar estragos se o prompt de continuação for devido a alguma condição excepcional, etc.
Responder2
Forneça a entrada ao extract
utilitário por meio do heredoc
mostrado:
extract - <<\__DATA__
Y
__DATA__