El comando Linux Wait le permite automatizar las interacciones con scripts y programas. Puede enviar cualquier tipo de respuesta al script cuando está esperando la entrada de texto.
Automatización significa eficiencia
Al administrar una computadora Linux o un grupo de computadoras, se encontrará con muchas tareas repetitivas. La respuesta obvia es escribir un guión para que haga la mayor parte del trabajo por usted. El shell Bash, como todos los shells modernos, proporciona un archivo lenguaje de secuencias de comandos rico y flexible.
Escribir una secuencia de comandos para un trabajo largo o tedioso le brinda la flexibilidad de ejecutar esa tarea cuando la oficina está cerrada o en las horas más tranquilas de una operación 24/7. Las secuencias de comandos también le brindan repetibilidad. No se olvidarán de realizar un paso, no importa cuántas veces se les pida que hagan las mismas tareas aburridas.
De acuerdo, qué tan lejos llega. Pero si su secuencia de comandos requiere la interacción del usuario o si llama a un programa que requerirá participación humana, ¿qué puede hacer? No quiere estar allí cuando se ejecuta el script, o si está allí, para mirar la ventana de la terminal lista para saltar y presionar algunas teclas.
Linux tiene la extensión yes
mando, que envía una secuencia de caracteres "y" o cualquier otra cadena especificada por el usuario en la ventana del terminal. Si un programa espera una respuesta a una pregunta de sí o no, forzará la alimentación de uno de los caracteres "y". Lo aceptará como entrada y podrá continuar. Necesita redirigir la salida de yes
en el guión.
yes | script.sh
Es posible que no desee publicar una respuesta afirmativa. Quizás tengas que decir "no". También puede hacer esto, usando el yes
mando. Puede enviar cualquier oración que desee, no está limitado a respuestas como "y", "Y", "Sí", "n", "N" o "No".
Tal vez necesite enviar una "r" para la reinstalación a un "install/upgrade/reinstall [i/u/r]
"requerido.
yes r
La yes
el comando no puede hacer frente si tiene que proporcionar más de un tipo de respuesta. Para esa situación, tenemos que usar expect
.
RELACIONADOS: Cómo usar el comando yes en Linux
Instale el 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 la expectativa
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 hacer esto, crea una secuencia de comandos "esperada" que verifica las solicitudes en la secuencia de comandos principal y envía la respuesta adecuada para cada una.
Supongamos que tiene un script de respaldo que requiere un nombre de directorio de origen y un nombre de directorio de destino. Luego crea 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 el script es pedir las rutas a los dos directorios. Imprima el directorio de destino en la ventana del terminal para que podamos ver que recibió una respuesta de expect
y que podía leerlo correctamente.
Para transmitir la otra mitad de la conversación, creamos un "guión esperado". Por convención, tienen la 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 esperados, el spawn
, expect
, es send
comandos.
Lo primero a tener en cuenta es el asunto se refiere a expect
, no en bash
. La -f
(archivo) bandera dice expect
las respuestas provienen de un archivo.
Deshabilitamos eficazmente los tiempos de espera configurándolos al infinito con -1.
La spawn
el comando inicia 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". Este es el archivo expect
el programa tendrá cuidado. Cuándo expect
ver el mensaje, el texto en el archivo send
La línea se devuelve al script "backup.sh".
La expect eof
las líneas dicen expect
espere a que finalice el archivo final cuando se complete 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".
Se convertirá en Fiddly Fast
Es genial ver dos scripts interactuar de esta manera, con las respuestas automáticas enviadas por nuestro script previsto y aceptadas como entrada genuina por el script automatizado. Este es solo un ejemplo simple, por supuesto. Si intenta automatizar un proceso laborioso, y son ellos los que desea automatizar, es posible que pronto se encuentre empantanado.
El texto en expect
las líneas deben coincidir exactamente con las indicaciones del script que está automatizando. Los errores ortográficos y las palabras mal escritas harán que se omita un mensaje y el proceso automatizado se bloqueará. Si todavía está desarrollando o modificando el guión que está intentando 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 modificar, eliminar o introducir mensajes. Hacer un seguimiento de los cambios y replicarlos en el script previsto se vuelve agotador y propenso a errores.
La forma más conveniente de crear una secuencia de comandos prevista 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 diseñado para nosotros.
Puede haber un poco de orden en el archivo de espera generado, pero eso 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á rastreando, capturará las pulsaciones de teclas incorrectas y sus cambios y retroceso para corregirlos. Para reordenarlo, simplemente elimine esa sección y escriba el texto correcto.
Usando autoexpect
Utilizando autoexpect
es fácil. Usamos el -f
(nombre de archivo) para decirle el nombre del archivo esperado que debe crear y el programa o script que queremos que se ejecute. Las solicitudes de proceso y nuestras respuestas se registran y se envían al archivo deseado. Como un buen toque autoexpect
hace que el archivo esperado sea ejecutable para nosotros.
Digamos que lo usamos con frecuencia rsync
para enviar archivos desde una computadora a un directorio en otra computadora En la red. Usaremos autoexpect
para crear un archivo de espera para ese proceso.
Nuestra línea de comando se ve así. El primer comando es autoexpect
seguido por -f
flag y el nombre del archivo esperado que queremos crear. En este caso, es "send-pics.exp".
El resto del comando es regular. rsync
mando. Por qué rsync
utilizar el SSH
protocolo a 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 de la cuenta del usuario dave en la computadora remota. Una vez insertados, 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 hacerlo llamándolo por su nombre:
./send-pics.exp
Esta vez el proceso se realiza sin interacción humana. Todos los archivos nuevos desde la última transferencia se envían a la máquina remota.
Esta es una secuencia de comandos de muestra muy pequeña. Casi no escatima esfuerzos en comparación con correr rsync
control manual. Si bien esto es cierto, ilustra dónde puede controlar programas y 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 del sistema Linux
¡Espera, mi contraseña!
Debe tener en cuenta que las contraseñas o cualquier otra información confidencial recopilada durante una autoexpect
las sesiones 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.
Por supuesto, esto no ayudará si no está usando SSH.
Puede editar su script esperado 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. Luego, el control vuelve a la secuencia de comandos esperada después de proporcionar la contraseña.
./send-pics.exp
Pero esto presenta un problema diferente. Significa que su secuencia de comandos ya no puede ejecutarse sin supervisión. Si siempre inicia su secuencia de comandos a mano, probablemente no importe, especialmente si la solicitud de contraseña ocurre justo al principio de la secuencia de comandos. Puede iniciar el script, ingresar la contraseña y luego dejar que se encargue de sí mismo.
Otra forma de abordar el problema es:
- Cambiar los permisos de archivo en su secuencia de comandos deseada usando
chown
al 740,-rwxr-x---
. - Usar
chmod
para cambiar el propietario del grupo de la secuencia de comandos esperada a un grupo de confianza. - Cree un guión regular que inicie su guión previsto. También configure este archivo para que sea propiedad del grupo de confianza. Establezca 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 deseada y con su propia
setgid
bit establecido. Independientemente de quién ejecute el script, su grupo real será el grupo de confianza y no el grupo de la persona que ejecuta el script. Por lo tanto, este script siempre podrá iniciar el script deseado. - Mientras tanto, el script esperado que contiene la contraseña es inaccesible para todos menos para usted.
RELACIONADOS: Cómo usar SUID, SGID y Sticky Bits en Linux
Puedes esperar grandes cosas
Hay suficiente para seguir adelante, pero hay mucho más por hacer expect
en comparación con las áreas que hemos cubierto. La expect
¡la página de manual tiene más de 1700 líneas!
Para tareas como instalaciones desatendidas, copias de seguridad programadas o implementaciones repetitivas, la expectativa transformará su flujo de trabajo.
Descubre más contenido