Automatice las entradas a los scripts de Linux con el comando wait

Contenidos

Bash Shell

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.

Contraseña almacenada en texto sin formato en el script de espera, en el editor gedit

Puede editar su script de espera y cambiar la línea que trata con su contraseña a:

interact ++ return

Comando interactivo en el script de espera, en el editor gedit

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.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.