Pochi amministratori di sistema nel mondo Linux hanno bisogno di essere convinti della potenza e dell'importanza degli script. Gli script sono ovunque e sai che sono essenziali per l'amministrazione del sistema Linux. Molti script vengono eseguiti in silenzio, anche se vengono avviati manualmente da un utente o da un amministratore.
Alcuni script, tuttavia, trasmettono informazioni agli utenti o richiedono loro informazioni. Puoi utilizzare funzionalità di scripting come echo
o read
per raggiungere questi obiettivi. Sfortunatamente, nessuno di questi strumenti mostra le informazioni in modo elegante o in un modo che attiri l'attenzione dell'utente.
Whiptail aggiunge una finestra di dialogo più interattiva ai tuoi script. Queste caselle forniscono informazioni, richiedono input o forzano un riconoscimento. Il contenuto visualizzato è in un formato di interfaccia utente basata su testo (TUI) e viene navigato con la scheda chiave. Le selezioni vengono scelte con lo Spazio chiave.
In questo articolo, ti guiderò attraverso l'installazione di whiptail
(è facile!) e poi dimostrare alcuni esempi di base.
[ Ai lettori è piaciuto anche: Quali linguaggi di programmazione sono utili per gli amministratori di sistema? ]
Installa Whistail
L'installazione è facile. Sto usando Fedora 33 per questi esempi. Whiptail è incluso come parte della più ampia libreria di newt, che aggiunge funzionalità alle finestre TUI.
Installa whiptail
utilizzando il seguente comando:
[damon@localhost ~]$ sudo dnf install newt
Questo è tutto per l'installazione.
In questo articolo creerai singoli file vim con il codice specifico di whiptail. Ricordarsi di svolgere le seguenti attività per ogni file dimostrato:
- Nominalo chiaramente
- Rendilo eseguibile digitando
chmod 744 demo.sh
- Eseguilo usando
./
prima del nome del file se la posizione non è lungo il PERCORSO
Nota :Presumo vim perché lo preferisco. Nano o qualsiasi altro editor di testo è sufficiente.
Successivamente, è il momento di coinvolgere alcuni script.
Visualizza una finestra di dialogo di base
In realtà non hai bisogno di uno script per visualizzare una finestra di dialogo di base da whiptail
. In questo esempio dichiarerai e poi chiamerai una variabile. La variabile è semplicemente un messaggio di qualche tipo che verrà riconosciuto con un OK pulsante. Non viene offerta alcuna scelta e non viene utilizzata la navigazione.
Al prompt dei comandi, digita le seguenti informazioni:
[damon@localhost ~]$ message="Today, we will learn about Whiptail."
[damon@localhost ~]$ whiptail --msgbox --title "Intro to Whiptail" "$message" 25 80
Una volta visualizzata l'interfaccia, nota che il titolo che hai specificato appare nella barra in alto. È presente anche il tuo messaggio. Il OK il pulsante è disponibile. Nel whiptail
comando, ne hai inseriti due
valori:25 e 80 . Questi valori sono misurazioni di colonna e possono essere regolati. Definiscono la dimensione della finestra dell'interfaccia. Fai attenzione a selezionare una dimensione che non occupi l'intero schermo e impedisca all'utente di vedere l'intero messaggio o di selezionare OK . La maggior parte delle finestre di Terminale sarà impostata su 80 colonne o più.
Dopo aver osservato tutti i componenti dell'interfaccia, seleziona OK premendo Invio chiave.
In questo esempio, hai utilizzato due opzioni:--msgbox
e --title
E ora un esempio più interessante.
Genera una query
Possono essere scritti script che accettano l'input di un utente. Se stai scrivendo uno script che interagirà con utenti non tecnici, potrebbe essere utile creare un'interfaccia più intuitiva. In questo esempio, all'utente verranno poste due domande:Nome e Paese.
Crea un file chiamato query.sh
con il seguente contenuto.
#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)"
Osserva che in questo esempio hai utilizzato --inputbox
invece di --msgbox
. Hai organizzato il whiptail
codice come un'istruzione if/then.
Gli 8 e 39 i valori definiscono la dimensione della finestra di dialogo. Se stai seguendo nel tuo ambiente di laboratorio, sostituisci 39 con 10 , salva le modifiche ed esegui nuovamente il whiptail
codice. Vedrai che la finestra di dialogo è troppo piccola per essere utile. Utilizza la scheda tasto per selezionare Annulla , quindi reimposta il valore della dimensione su 39 da 10 .
Non dimenticare di impostare i permessi per rendere eseguibile il file e utilizzare ./
per eseguirlo dalla posizione corrente.
[damon@localhost ~]$ chmod 777 query.sh
[damon@localhost ~]$ ./query.sh
Ecco uno sguardo ai risultati dopo aver completato la finestra di dialogo:
Hai fornito informazioni agli utenti tramite una finestra di messaggio e raccolto informazioni dall'utente tramite una casella di input. Quindi, poni all'utente alcune domande aggiuntive.
Crea una finestra di dialogo sì/no
Ci sono molte varianti per porre domande all'utente. In questo caso, utilizzerai una semplice query sì/no per scoprire se oggi è martedì. Puoi farlo creando un file di prova chiamato tuesday.sh
e inserendo il seguente contenuto al suo interno:
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
Invece di --inputbox
o --msgbox
dagli esempi precedenti, hai usato --yesno
opzione. Come l'esempio precedente, questo è organizzato come una query if/then.
Ecco l'output risultante:
Il --yesno
box option ci permette anche di modificare il contenuto dei campi "Sì" e "No". Ecco un esempio:
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
L'unica modifica all'esempio è l'aggiunta dei due --no-button
e --yes-button
opzioni, con il testo corrispondente (in questo caso "Non martedì" e "Martedì").
Ecco come appare la finestra di dialogo risultante:
Un'ultima cosa. Whiptail invia l'input dell'utente a stderr. Sì, hai letto bene:stderr e
non stdout, che è il punto in cui raccogli l'input dell'utente per utilizzarlo nello script. Il modo per aggirare questo problema è invertire il reindirizzamento in modo che l'input dell'utente vada a stdout.
Ecco la frase per farlo:
3>&1 1>&2 2>&3
Spiegazione:
- Crea un descrittore di file 3 che punti a 1 (stdout)
- Reindirizza 1 (stdout) a 2 (stderr)
- Reindirizza 2 (stderr) al descrittore di file 3, che punta a stdout
Ecco come appare in uno snippet di script dal --inputbox
sopra esempio:
NAME=$(whiptail --inputbox "What is your name?" 8 39 --title "Getting to know you" 3>&1 1>&2 2>&3)
[ Cheat sheet gratuito:glossario Kubernetes ]
Concludi
Ho mostrato diversi esempi di base, ma whiptail
può fare molto di più. Ho fornito abbastanza informazioni qui per iniziare e ci sono molti tutorial utili online. I tuoi script avranno bisogno di un modo per consumare l'input che gli utenti hanno inserito. Ti incoraggio a rivedere i tuoi script interattivi per determinare se l'aggiunta di finestre di dialogo TUI sarebbe utile.
Ecco un elenco delle opzioni della casella principale disponibili per whiptail
:
- --titolo
- --casella informativa
- --msgbox
- --sì
- --casella di immissione
- --passwordbox
- --menu
- --casella di testo
- --lista di controllo
- --radiolista
- --indicatore