
Estoy ejecutando a Amanda para mis copias de seguridad. Necesito restaurar un montón de archivos de diferentes fechas. Los archivos tienen el mismo nombre, por lo que necesito realizar varias sesiones de restauración. Entonces, pensé en escribir el guión. Aquí está mi guión:
sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract
Ejecuto el script usando la redirección de shell:
amrecover my_Config < /home/me/thatScript
El problema es que tan pronto como amrecover ve elextractocomando me pide que confirme.
Continue? [Y/n]:
Poner "Y" en la línea después de "extraer" no funciona. Amrecover se sienta allí y espera a que escriba "Y". Me imagino que amrecover quiere la entrada del tty y no solo de la entrada estándar.
Miré la página de manual de amrecover y también busqué en Google para ver si alguien se había dado cuenta de esto. Y el código está compilado, por lo que no puedo piratear un script sin esperar la confirmación.
¿Hay alguna manera de recibir información de un script y redirigir /dev/tty a la entrada estándar?
Respuesta1
amrecover
está pensado para ser un script interactivo, por lo que tradicionalmente se puede utilizar para automatizarlo expect
. Esta tcl
utilidad se puede crear para verificar la conversación en busca de los dos estilos de mensaje ( amrecover>
y Continue? [Y/n]:
) y responderlos de manera diferente. Por ejemplo, cree un archivo myrecover
en su RUTA, hágalo ejecutable ( chmod +x myrecover
) y coloque lo siguiente en él:
#!/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
Luego ejecútelo como
./myrecover </home/me/thatScript
El expect
script se bifurca y ejecuta su comando amrecover my_Config
, conectándose a él a través de un pty, luego escucha la entrada en busca de las dos indicaciones. Cuando aparece el mensaje habitual amrecover>
, leemos una línea de la entrada estándar del expect
script, es decir, su conjunto de comandos, y (si no obtuvimos el final del archivo) enviamos esa línea al programa, con una nueva línea ( \r
se convierte a esto). Esto exp_continue
hace que el comando se repita nuevamente para la siguiente coincidencia de mensaje. Al final del archivo cerramos la conexión con el programa y esperamos a que salga.
Tenga en cuenta que ejecutar amanda
de esta manera puede causar estragos si el mensaje de continuación es por alguna condición excepcional, etc.
Respuesta2
Proporcione la entrada a la extract
utilidad a través de heredoc
como se muestra:
extract - <<\__DATA__
Y
__DATA__