Cómo usar la cola de látigo para crear guiones interactivos más fáciles de usar

Pocos administradores de sistemas en el mundo de Linux necesitan estar convencidos del poder y la importancia de las secuencias de comandos. Los scripts están en todas partes y sabe que son esenciales para la administración del sistema Linux. Muchas secuencias de comandos se ejecutan de forma silenciosa, incluso si un usuario o administrador las inicia manualmente.

Sin embargo, algunos scripts transmiten información a los usuarios o les solicitan información. Puede usar funciones de secuencias de comandos como echo Donde read para lograr estos objetivos. Desafortunadamente, ninguna de estas herramientas muestra información de una manera elegante o que atraiga la atención del usuario.

Whiptail agrega un diálogo más interactivo a sus scripts. Estas casillas brindan información, solicitan comentarios o fuerzan un reconocimiento. El contenido que se muestra tiene un formato de interfaz de usuario basada en texto (TUI) y se explora con el Lengua llave. Las selecciones se eligen con el Espacio llave.

En este artículo, lo guío a través de la instalación whiptail (¡eso es fácil!), luego muestre algunos ejemplos básicos.

Índice

    instalar una cola de caballo

    La instalación es fácil. Estoy usando Fedora 33 para estos ejemplos. Whiptail se incluye como parte de la más grande tritón biblioteca, que agrega funcionalidad a las ventanas TUI.

    Instalar whiptail usando el siguiente comando:

    [[email protected] ~]$ sudo dnf install newt

    Tanto para la instalación.

    En este artículo, creará archivos vim individuales con código específico para whiptail. Recuerde completar las siguientes tareas para cada archivo demostrado:

    • Nómbrelo claramente
    • Hazlo ejecutable escribiendo chmod 744 demo.sh
    • ejecutarlo usando ./ antes del nombre del archivo si la ubicación no está a lo largo de la RUTA

    Notar: Supongo que vim porque lo prefiero. Nano o cualquier otro editor de texto es suficiente.

    Entonces es hora de involucrar algunos guiones.

    Mostrar un cuadro de diálogo básico

    En realidad, no necesita una secuencia de comandos para abrir un cuadro de diálogo básico desde whiptail. En este ejemplo, declarará y luego llamará a una variable. La variable es simplemente cualquier mensaje que será reconocido con un Correcto botón. No se ofrece ninguna opción y no se utiliza la navegación.

    En el símbolo del sistema, ingrese la siguiente información:

    [[email protected] ~]$ message="Today, we will learn about Whiptail."
    [[email protected] ~]$ whiptail --msgbox --title "Intro to Whiptail" "$message" 25 80
    Cuadro de diálogo generado por whiptail. Tenga en cuenta los campos de título, mensaje y Aceptar.

    Una vez que se muestra la interfaz, observe que el título que especificó aparece en la barra superior. Su mensaje también está presente. el Correcto el botón está disponible. En el whiptail comando, ingresó dos

    valores: 25 y 80. Estos valores son medidas de columna y se pueden ajustar. Definen el tamaño de la ventana de la interfaz. Tenga cuidado de seleccionar un tamaño que no ocupe toda la pantalla y evite que el usuario vea todo el mensaje o seleccione Correcto. La mayoría de las ventanas de terminal se establecerán en 80 columnas o más.

    Una vez que haya observado todos los componentes de la interfaz, seleccione Correcto presionando el botón Entrar llave.

    En este ejemplo, utilizó dos opciones: --msgbox y --title

    Y ahora un ejemplo más interesante.

    Generar una consulta

    Los scripts se pueden escribir para aceptar la entrada de un usuario. Si está escribiendo un script que interactuará con usuarios no técnicos, puede ser beneficioso crear una interfaz más fácil de usar. En este ejemplo, se le harán dos preguntas al usuario: Nombre y país.

    Crear un archivo con nombre query.sh con el siguiente contenido.

    #Part 1 - Query for the user's name
    NAME=$(whiptail --inputbox "What is your name?" 8 39 --title "Getting to know you" 3>&1 1>&2 2>&3)
                                                                            
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
    echo "Greetings," $NAME
    else
    echo "User canceled input."
    fi
    
    echo "(Exit status: $exitstatus)"
    
    #Part 2 - Query for the user's country
    
    COUNTRY=$(whiptail --inputbox "What country do you live in?" 8 39 --title "Getting to know you" 3>&1 1>&2 2>&3)
                                                                           
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
    echo "I hope the weather is nice in" $COUNTRY
    else
    echo "User canceled input."
    fi
    
    echo "(Exit status: $exitstatus)"

    Note que en este ejemplo usó --inputbox en lugar de --msgbox. organizaste el whiptail código como una declaración si/entonces.

    el 8 y 39 los valores definen el tamaño del cuadro de diálogo. Si está monitoreando en su propio entorno de laboratorio, reemplace 39 con diez, guarde sus cambios y vuelva a ejecutar el whiptail codificado Verá que el cuadro de diálogo es demasiado pequeño para ser útil. Utilizar el Lengua botón para seleccionar anular, luego cambie el valor del tamaño de nuevo a 39 a partir de diez.

    Recuerde establecer los permisos para hacer que el archivo sea ejecutable y use ./ para ejecutarlo desde la ubicación actual.

    [[email protected] ~]$ chmod 777 query.sh 
    [[email protected] ~]$ ./query.sh 

    Aquí hay una vista previa de los resultados después de completar el cuadro de diálogo:

    Resultado del cuadro de diálogo de cola de látigo que muestra el nombre de usuario y el país según lo solicitado.

    Usted proporcionó información a los usuarios a través de un cuadro de mensaje y recopiló información del usuario a través de un cuadro de entrada. Luego, hágale al usuario algunas preguntas más.

    Crear un cuadro de diálogo sí/no

    Hay muchas variaciones para hacer preguntas al usuario. En ese caso, utilizará una simple consulta sí/no para averiguar si hoy es martes. Puede hacer esto creando un archivo de prueba llamado tuesday.sh e insertando el siguiente contenido:

    if (whiptail --title "Is it Tuesday?" --yesno "Is today Tuesday?" 8 78); then
        echo "Happy Tuesday, exit status was $?."
    else
        echo "Maybe it will be Tuesday tomorrow, exit status was $?."
    
    fi

    En vez de --inputbox Donde --msgbox de los ejemplos anteriores, usó el --yesno opción. Al igual que el ejemplo anterior, este está organizado como una consulta si/entonces.

    Solicito saber si hoy es martes. Tenga en cuenta las opciones de respuesta "Sí" y "No".

    Aquí está el resultado obtenido:

    Salida de la solicitud tuesday.sh.

    el --yesno La opción de casilla también nos permite modificar el contenido de los campos "Sí" y "No". Aquí un ejemplo:

    if (whiptail --title "Is it Tuesday?" --yesno "Is today Tuesday?" 8 78 --no-button "Not Tuesday" --yes-button "Tuesday"); then
    echo "Happy Tuesday, exit status was $?."
    else
    echo "Maybe it will be Tuesday tomorrow, exit status was $?."
    fi

    El único cambio en el ejemplo es la adición de los dos --no-button y --yes-button opciones, con su correspondiente texto (en este caso, "Martes No" y "Martes").

    Así es como se ve el cuadro de diálogo resultante:

    Tenga en cuenta que los botones ya no ofrecen las opciones Sí y No, sino las opciones Martes y No martes.

    Una última cosa. Whiptail envía la entrada del usuario a stderr. Sí, has leído bien: stderr, y

    no stdout, aquí es donde obtiene la entrada del usuario para consumirla en el script. La forma de evitar este problema es invertir la redirección para que la entrada del usuario pase a la salida estándar.

    Aquí está la frase para hacerlo:

    3> y 1 1> y 2 2> y 3

    Explicación:

    • Cree un descriptor de 3 archivos que apunte a 1 (stdout)
    • Redirigir 1 (stdout) a 2 (stderr)
    • Redirigir 2 (stderr) al descriptor de archivo 3, que apunta a stdout

    Así es como se ve en un fragmento de script anterior --inputbox Ejemplo:

    NAME=$(whiptail --inputbox "What is your name?" 8 39 --title "Getting to know you" 3>&1 1>&2 2>&3)

    Conclusión

    He mostrado varios ejemplos básicos, pero whiptail puede hacer mucho más. He proporcionado suficiente aquí para que pueda comenzar, y hay muchos tutoriales útiles en línea. Sus scripts necesitarán una forma de consumir la entrada que los usuarios han escrito. Lo animo a que revise sus scripts interactivos para ver si sería útil agregar cuadros de diálogo TUI.

    Aquí hay una lista de las principales opciones de caja disponibles para whiptail:

    • --Título
    • - Caja de información
    • --msgbox
    • --Si no
    • --campo de entrada
    • --caja de contraseñas
    • --menú
    • --zona de texto
    • --Lista de controles
    • --radiolista
    • --indicador

    Artículos de interés

    Subir