El comando de espera de Linux le posibilita automatizar las interacciones con scripts y programas. Puede enviar cualquier tipo de respuesta al script cuando está esperando alguna entrada de texto.
Automatización significa eficiencia
Cuando administra una computadora Linux o un grupo de computadoras, se encontrará con muchas tareas repetitivas. La solución obvia es escribir un guión para realizar la mayor parte del trabajo por usted. La cáscara Bash, como todas las cáscaras modernas, proporciona una lenguaje de secuencias de comandos rico y flexible.
La creación de secuencias de comandos para un trabajo tedioso o tedioso le brinda la flexibilidad de ejecutar esa tarea cuando la oficina está cerrada o en los períodos más silenciosos de una operación las 24 horas del día, los 7 días de la semana. Los scripts además le brindan repetibilidad. No se olvidarán de realizar un paso, no importa cuántas veces se les pida que realicen las mismas tareas aburridas.
Eso está bien, en la medida de lo factible. Pero si su secuencia de comandos necesita la interacción del usuario, o si llama a un programa que necesitará participación humana, ¿qué puede hacer? No querrás tener que presentarse cuando se ejecute el script, o si estás presente, estar mirando la ventana de la terminal lista para saltar y presionar algunas teclas.
Linux tiene el yes
mando, que envía una secuencia de caracteres «y» o cualquier otra cadena especificada por el usuario a la ventana de terminal. Si un programa está esperando una respuesta a una pregunta de sí o no, se forzará uno de los caracteres «y». Lo aceptará como entrada y podrá continuar. Necesita canalizar la salida desde yes
en el guión.
yes | script.sh
Es factible que no desee enviar una respuesta afirmativa. Tal vez necesite decir «no». Además puede hacer eso, usando el yes
mando. Puede enviar cualquier frase que desee, no está restringido a respuestas como «y», «Y», «Sí», «n», «N» o «No».
Tal vez necesite enviar una «r» para reinstalar a un «install/upgrade/reinstall [i/u/r]
» inmediato.
yes r
los yes
El comando no puede hacer frente si necesita proporcionar más de un tipo de respuesta. Para esa situación, necesitamos utilizar expect
.
RELACIONADO: Cómo usar el comando yes en Linux
Instalación del comando de espera
Probamos expect
en Ubuntu, Fedora y Manjaro. El paquete no estaba incluido con estas distribuciones, por lo que tuvo que instalarse. En Ubuntu escriba:
sudo apt install expect
En Fedora, el comando que necesita es:
sudo dnf install expect
En Manjaro usamos pacman
:
sudo pacman -Sy expect
¿Cómo funciona esperar?
los expect
El comando le posibilita administrar los dos extremos de la conversación entre su conjunto de respuestas preparadas y el programa o script al que las enviará. Para esto, crea una secuencia de comandos «esperada» que busca indicaciones en la secuencia de comandos principal y envía la solución adecuada para cada una.
Supongamos que tiene un script de respaldo que solicita un nombre de directorio de origen y un nombre de directorio de destino. A continuación, realiza una copia de los archivos del directorio de origen en el directorio de destino. Sin los bits que copian el archivo, su secuencia de comandos podría verse así:
#!/bin/bash echo "Directory to backup?" read source_directory echo "Backup location?" read target_directory echo echo "Target directory:" $target_directory
Todo lo que hace este script es pedir las rutas a los dos directorios. Imprime el directorio de destino en la ventana del terminal para que podamos ver que recibió una respuesta de expect
y que pudiera leerlo correctamente.
Para proporcionar la otra mitad de la conversación, creamos un «guión esperado». Por convención, estos disponen una extensión «.exp». Este ejemplo funcionará con nuestro script «backup.sh».
#!/usr/bin/expect -f set timeout -1 spawn ./backup.sh expect "Directory to backup?r" send -- "/home/dave/Documents/r" expect "Backup location?r" send -- "/media/dave/external/backupr" expect eof
Esto muestra los tres comandos principales en los scripts de espera, el spawn
, expect
, y send
comandos.
Lo primero en notar es el tinglado se refiere a expect
, No a bash
. los -f
(archivo) la bandera dice expect
las respuestas provienen de un archivo.
Efectivamente, desactivamos los tiempos de espera al establecerlos en infinito con -1.
los spawn
comando lanza el script de respaldo.
Conocemos las dos preguntas que nos hará el script “backup.sh”. Para cada pregunta creamos una línea de «espera». Estos contienen el mensaje de texto que se enviará a la ventana del terminal a través de el script «backup.sh». Esto es lo que expect
el programa estará atento. Cuando expect
ve el mensaje, el texto en el send
La línea se devuelve al script «backup.sh».
los expect eof
las líneas dicen expect
para esperar el final del archivo final al finalizar el procesamiento en el script automatizado.
Haga que ambos scripts sean ejecutables:
chmod +x backup.sh
chmod +x backup.exp
Y use el script «backup.exp» para iniciar todo el procedimiento.
./backup.exp
Puede ver las dos indicaciones de «backup.sh» y las respuestas de «backup.exp».
Eso se pondrá Fiddly Fast
Es genial ver dos scripts interactuando de esta manera, con las respuestas automáticas enviadas por nuestro script de espera y aceptadas como entrada genuina por el script automatizado. Este es solo un ejemplo simple, decididamente. Si intenta automatizar un procedimiento largo, y ellos son los que querrá automatizar, pronto se verá atascado.
El texto en el expect
las líneas deben coincidir exactamente con las indicaciones del script que está automatizando. Los errores ortográficos y la redacción incorrecta harán que se omita un mensaje y el procedimiento automatizado se detendrá. Si aún está desarrollando o modificando el guión que está tratando de automatizar, es probable que cambie la redacción de las indicaciones y su orden dentro del guión. Las actualizaciones de scripts o programas pueden cambiar, quitar o introducir mensajes. Hacer un seguimiento de los cambios y replicarlos en su script esperado se torna tedioso y propenso a errores.
La forma más conveniente de crear un script de espera es utilizar autoexpect
. Esto se instala junto con expect
. Podemos decir autoexpect
para monitorear nuestra interacción en la vida real con un script o programa, y generar un archivo de espera para nosotros.
Puede que haya que hacer algunos arreglos en el archivo de espera generado, pero es mucho más rápido que escribir uno a mano. A modo de ejemplo, si escribe mal algo en su sesión cuando autoexpect lo está monitoreando, se capturarán las pulsaciones de teclas incorrectas y su edición y retroceso para corregirlas. Para arreglar eso, simplemente elimine esa sección y escriba el texto correcto.
Usando autoexpect
Usando autoexpect
es fácil. Usamos el -f
(nombre de archivo) para indicarle el nombre del archivo esperado que debe crear y el programa o script que queremos que se ejecute. Las indicaciones del procedimiento y nuestras respuestas se registran y se envían al archivo de espera. Como un buen toque, autoexpect
hace que el archivo de espera sea ejecutable para nosotros.
Digamos que usamos a menudo rsync
para enviar archivos desde una computadora a un directorio en otra computadora a través de la red. Usaremos autoexpect
para crear un archivo de espera de ese procedimiento.
Nuestra línea de comando se ve así. El primer comando es autoexpect
Seguido por el -f
flag y el nombre del archivo de espera que queremos crear. En esta circunstancia, es «send-pics.exp».
El resto del comando es el regular rsync
mando. Debido a que rsync
utiliza el SSH
protocolo para conectarse de forma remota a la computadora de destino, necesitaremos proporcionar la contraseña para la cuenta de usuario «dave» en la computadora de destino.
autoexpect -f send-pics.exp rsync -rasv ~/Pictures/raw/ [email protected]:/home/dave/raw/
Cuando ejecutamos ese comando rsync
se inicia y se nos solicita la contraseña para la cuenta del usuario dave en la computadora remota. Una vez que se ingresa, algunos archivos se envían a la computadora remota, rsync
rompe la conexión y el procedimiento termina.
Se nos dice que se ha creado el archivo «send-pics.exp». Vamos a ver:
ls -l send-pics.exp
En realidad, ha sido creado y es ejecutable. Podemos ejecutarlo llamándolo por su nombre:
./send-pics.exp
Esta vez, el procedimiento se ejecuta sin ninguna interacción humana. Todos los archivos nuevos desde la última transferencia se envían a la máquina remota.
Este es un script de ejemplo muy pequeño. Apenas ahorra esfuerzo en comparación con ejecutar el rsync
comando a mano. Aunque eso es cierto, ilustra el punto de que puede controlar tanto programas como scripts, y puede aplicar los principios que se ven aquí a scripts o procesos de cualquier longitud.
RELACIONADO: Cómo hacer una copia de seguridad de su sistema Linux
¡Espera, mi contraseña!
Debe prestar atención que cualquier contraseña, o cualquier otra información confidencial, recopilada durante una autoexpect
La sesión se almacenan en texto sin formato en el script de espera generado. Las contraseñas nunca deben escribirse en texto plano en ningún lugar. Para las conexiones SSH, una mejor solución es utilizar claves SSH y tener un esquema de autenticación sin contraseña.
Evidentemente, eso no ayudará si no está usando SSH.
Puede editar su script de espera y cambiar la línea que trata con su contraseña a:
interact ++ return
Cuando el script llegue a esta línea, esperará su entrada, lo que le permitirá ingresar su contraseña. Control posteriormente regresa al script esperado una vez que haya proporcionado su contraseña.
./send-pics.exp
Pero eso presenta un obstáculo distinto. Significa que su secuencia de comandos ya no puede abrirse sin supervisión. Si siempre va a iniciar manualmente su secuencia de comandos, probablemente no importe, especialmente si la solicitud de contraseña ocurre justo al comienzo de la secuencia de comandos. Puede iniciar el script, ingresar su contraseña y posteriormente dejar que se cuide solo.
Otra manera de abordar el problema es:
- Cambiar los permisos del archivo en su script esperado usando
chown
al 740,-rwxr-x---
. - Utilizar
chmod
para cambiar el propietario del grupo de la secuencia de comandos de espera a un grupo de confianza. - Cree un script regular que inicie su script esperado. Configure este archivo para que además sea propiedad del grupo de confianza. Establezca los permisos sobre esto en 2751,
-rwxr-s--x
. - Esto crea una secuencia de comandos de inicio que cualquiera puede leer y ejecutar, que está en el mismo grupo de confianza que la secuencia de comandos de espera, y con su
setgid
bit establecido. Sin tener en cuenta quién ejecute este script, su grupo efectivo será el grupo de confianza y no el grupo de la persona que ejecuta el script. Por eso, este script siempre podrá ejecutar el script de espera. - Mientras tanto, la secuencia de comandos de espera que contiene la contraseña es inaccesible para nadie más que para usted.
RELACIONADO: Cómo usar SUID, SGID y Sticky Bits en Linux
Puedes esperar grandes cosas
Aquí hay suficiente para ponerte en marcha, pero hay mucho más para expect
que las áreas que hemos cubierto. los expect
¡La página man tiene más de 1700 líneas!
Para tareas como instalaciones automatizadas, copias de seguridad programadas o implementaciones repetitivas, esperar transformará su flujo de trabajo.