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

Bash Shell

El comando de espera de Linux le permite 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 respuesta 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 largo 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 24/7. Los scripts también 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 posible. Pero si su secuencia de comandos requiere la interacción del usuario, o si llama a un programa que necesitará participación humana, ¿qué puede hacer? No querrás tener que estar presente 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 posible que no desee enviar una respuesta afirmativa. Quizás necesite decir «no». También 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».

Quizás necesite enviar una «r» para reinstalar a un «install/upgrade/reinstall [i/u/r] » inmediato.

yes r

La yes El comando no puede hacer frente si necesita proporcionar más de un tipo de respuesta. Para esa situación, necesitamos usar expect .

RELACIONADOS: 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?

La expect El comando le permite administrar los dos extremos de la conversación entre su conjunto de respuestas preparadas y el programa o script al que las enviará. Para ello, crea una secuencia de comandos «esperada» que busca indicaciones en la secuencia de comandos principal y envía la respuesta 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 tienen 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. La -f (archivo) la bandera dice expect las respuestas provienen de un archivo.

Efectivamente, desactivamos los tiempos de espera al establecerlos en infinito con -1.

La 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 mediante el script «backup.sh». Esto es lo que expect el programa estará atento. Cuándo expect ve el mensaje, el texto en el send La línea se devuelve al script «backup.sh».

La 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 proceso.

./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, por supuesto. Si intenta automatizar un proceso 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 proceso automatizado se detendrá. Si todavía 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, eliminar o introducir mensajes. Hacer un seguimiento de los cambios y replicarlos en su script esperado se vuelve tedioso y propenso a errores.

La forma más conveniente de crear un script de espera es usar 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. Por 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

Utilizando 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 proceso 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 con frecuencia 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 proceso.

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 este caso, es «send-pics.exp».

El resto del comando es el regular rsync mando. Porque rsync usa 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/ dave@nostromo.local:/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 proceso termina.

Se nos dice que se ha creado el archivo «send-pics.exp». Vamos a ver:

ls -l send-pics.exp

De hecho, ha sido creado y es ejecutable. Podemos ejecutarlo llamándolo por su nombre:

./send-pics.exp

Esta vez, el proceso 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. Si bien 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.

RELACIONADOS: Cómo hacer una copia de seguridad de su sistema Linux

¡Espera, mi contraseña!

Debe tener en cuenta 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 usar claves SSH y tener un esquema de autenticación sin contraseña.

Obviamente, 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 luego regresa al script esperado una vez que haya proporcionado su contraseña.

./send-pics.exp

Pero eso presenta un problema diferente. Significa que su secuencia de comandos ya no puede ejecutarse 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 luego dejar que se cuide solo.

Otra forma de abordar el problema es:

  • Cambiar los permisos del archivo en su script esperado usando chown al 740, -rwxr-x---.
  • Usar 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 también 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. Independientemente de 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 lo tanto, 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.

RELACIONADOS: 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. La 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.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad