Automatice las entradas a los scripts de Linux con el comando esperado: CloudSavvy IT

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.

Índice de contenidos()

    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/ [email protected]:/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.

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

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

    interact ++ return

    Comando interactivo en el script esperado, en el editor gedit

    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.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir