Comment intégrer des boîtes de dialogue dans des scripts shell avec Whiptail
La possibilité de créer des scripts shell sécurisés est essentielle non seulement pour les administrateurs système, mais aussi pour les utilisateurs qui souhaitent automatiser des tâches répétitives. Parfois, à partir de nos scripts shell, nous devons fournir à l’utilisateur une sorte d’information, lui demander de fournir des commentaires, choisir parmi un ensemble d’alternatives, ou simplement demander sa confirmation avant d’effectuer une opération potentiellement dangereuse. Toutes ces actions peuvent être effectuées à partir de la ligne de commande, bien sûr, mais pour rendre nos scripts plus conviviaux, nous pouvons utiliser Whiptail pour personnaliser et afficher des widgets textuels.
Dans cet article, nous voyons comment nous pouvons rendre nos scripts plus conviviaux en utilisant des widgets textuels créés avec Whiptail.
Dans ce tutoriel, vous allez apprendre :
- Comment installer whiptail et la bibliothèque newt dans certaines des distributions Linux les plus utilisées
- Comment utiliser whiptail pour produire des widgets d’interface utilisateur textuels à partir de nos scripts shell
- Comment utiliser le widget messagebox pour afficher un message simple
- Comment utiliser le widget yesno pour permettre à l’utilisateur d’effectuer un choix binaire
- Comment obtenir une entrée utilisateur avec les widgets inputbox et passwordbox
- Comment créer des menus avec les widgets de menu et de liste de contrôle
Installation
Whiptail et la bibliothèque « newt » sont des logiciels libres et open source. De la même manière que dialog et la bibliothèque ncurses, ils peuvent être utilisés pour afficher des widgets textuels à partir de scripts shell. Whiptail est disponible dans les dépôts de toutes les distributions Linux les plus utilisées. Pour l’installer sur Fedora, nous pouvons exécuter :
sudo dnf install newtSur Debian et d’autres distributions Linux basées sur Debian, en revanche, nous installons directement le paquet whiptail. Nous pouvons le faire en utilisant apt :
sudo apt install whiptailSur Archlinux, à la place, pour obtenir Whiptail, nous devons installer le paquet libnewt qui fait partie du dépôt « Community ». Nous effectuons l’installation à l’aide du gestionnaire de paquets pacman :
sudo pacman -Sy libnewtComment utiliser whiptail pour afficher des widgets
Nous pouvons utiliser Whiptail pour rendre nos scripts shell interactifs plus conviviaux. Voyons un exemple de son utilisation.
Affichage d’un message simple
Dans notre premier exemple, nous montrons comment utiliser Whiptail pour afficher un message simple à l’utilisateur. Pour ce faire, nous lançons la commande avec l’option --msbox. Comme arguments à la commande, nous fournissons :
- Le texte à afficher à l’utilisateur
- La hauteur du widget (exprimée en lignes)
- La largeur du widget (exprimée en colonnes)
whiptail --msgbox "This is a simple message!" 10 30Voici le widget produit par la commande :
Affichage d’une boîte de dialogue oui/non
Pour afficher une sorte de message à un utilisateur et lui permettre d’effectuer un simple choix « binaire », nous pouvons lancer whiptail avec l’indicateur --yesno. Les arguments que nous devons fournir sont les mêmes que ceux que nous avons utilisés dans l’exemple précédent. Ici, nous créons une boîte de dialogue que nous pouvons utiliser pour demander la confirmation de l’utilisateur :
whiptail --yesno "Are you sure you want to perform the action?" 10 30Voici le résultat produit par la commande :
On peut déterminer le choix sélectionné par l’utilisateur en vérifiant le code de sortie de la commande stockée dans la variable shell $ ? : il sera 0 si la réponse affirmative est sélectionnée, 1 sinon.
Demander des commentaires
Dans l’exemple précédent, nous avons utilisé le widget « yesno » pour demander à l’utilisateur d’effectuer un choix binaire. Dans certaines situations, nous pouvons avoir besoin de demander à l’utilisateur de fournir une entrée plus générique sous la forme d’une chaîne. Supposons, par exemple, que nous souhaitions demander à l’utilisateur de fournir un « nom d’utilisateur ». Pour accomplir cette tâche, nous lançons Whiptail avec l’option --inputbox. Les arguments que nous devons fournir sont les mêmes que ceux que nous avons vus dans les exemples précédents, plus un optionnel, [init] : nous pouvons l’utiliser pour spécifier un « placeholder " pour l’entrée. En voici un exemple :
whiptail --inputbox "What is your username?" 10 30 "root"La commande génère la boîte de dialogue suivante :
Comment récupérer ou stocker l’entrée de l’utilisateur ? Si l’utilisateur appuie sur « OK », l’entrée qu’il a fournie est imprimée en erreur standard. Supposons que nous voulions « stocker » l’entrée dans une variable, nous exécuterions :
username="$(whiptail --inputbox "What is your username?" 10 30 "root" 3>&1 1>&2 2>&3)"Quelles sont toutes ces redirections à la fin de la commande ? Comme nous le savons, il existe trois descripteurs de fichier utilisés par le shell : entrée standard (0), sortie standard (1) et erreur standard (2). Whiptail utilise le descripteur de fichier de sortie standard pour afficher les widgets et, comme nous l’avons déjà dit, imprime l’entrée de l’utilisateur à l’erreur standard. Lorsque nous utilisons le mécanisme de substitution de commande, une commande est substituée par sa sortie, qui est ce que nous stockons généralement dans une variable. Dans ce cas, cependant, ce que nous voulons stocker dans la variable est l’erreur standard produite par la commande, nous devons donc échanger la sortie standard et l’erreur standard pour atteindre notre objectif. Comment pouvons-nous faire cela ?
Lorsque nous effectuons une redirection, nous dupliquons un descripteur de fichier dans un autre. Par exemple, si nous écrivons :
1>&2Ce que nous disons, c’est : « utilisez une copie du descripteur de fichier d’erreur standard (2) pour la sortie standard ». Pour échanger les descripteurs de fichier de sortie standard et d’erreur standard, nous pouvons donc écrire :
3>&1 1>&2 2>&3Avec ces redirections, nous :
- Dupliquer le descripteur de fichier 1 (sortie standard) vers le descripteur de fichier 3
- Dupliquer le descripteur de fichier 2 (erreur standard) vers le descripteur de fichier 1 (sortie standard)
- Dupliquer le descripteur de fichier 3 (qui, dans la première étape, nous avons fait une copie de la sortie standard d’origine) vers le descripteur de fichier 2 (erreur standard)
En d’autres termes, nous venons d’échanger l’erreur standard et la sortie standard. Nous avons utilisé un descripteur de fichier supplémentaire (3) comme « endroit temporaire » pour stocker la sortie standard d’origine, qui autrement serait perdue. À ce stade, la chaîne saisie en entrée par l’utilisateur est affichée en sortie standard et, puisque nous avons utilisé la substitution de commande, est « stockée » dans la variable « username » :
echo $username
root
Inviter l’utilisateur à saisir un mot de passe
La boîte de dialogue « mot de passe » fonctionne de la même manière que la boîte de dialogue « saisie » : la seule différence est que les caractères saisis par l’utilisateur ne s’affichent pas au fur et à mesure qu’il tape, pour des raisons de sécurité. Pour créer une boîte de dialogue de mot de passe, nous lançons Whiptail avec l’option --passwordbox. Ici, comme nous l’avons fait dans l’exemple précédent, nous stockons l’entrée dans une variable :
password="$(whiptail --passwordbox "Please enter your password:" 10 30 3>&1 1>&2 2>&3)"Le widget généré par la commande :
Affichage d’un menu
La boîte de menu est créée en lançant whiptail avec l’option --menu, et peut être utilisée pour présenter à l’utilisateur de choisir une entrée parmi une liste d’alternatives. En tant qu’arguments de l’option, nous fournissons les arguments habituels plus la hauteur du menu et une paire balise/élément pour chaque choix que nous voulons inclure dans le menu. Le « tag » représente le nom du choix, le « item » est une description de celui-ci. En voici un exemple :
whiptail \
--menu "What is your favorite shell?" 10 35 2 \
"Bash" "(Bourne Again shell)" \
"Zsh" "(Z-Shell)"
Voici le résultat de la commande :
L’utilisateur peut naviguer dans le menu à l’aide des touches HAUT et BAS. L’entrée qu’il sélectionne est imprimée avec le descripteur d’erreur standard, une fois qu’il appuie sur <Ok>.
Permettre à l’utilisateur de sélectionner plus d’un choix
Lorsque le widget « menu » est utilisé, l’utilisateur n’est autorisé à sélectionner qu’une seule entrée parmi celles que nous fournissons. Si nous voulons autoriser plusieurs sélections, nous devons utiliser le widget « checklist ». Nous pouvons le générer en lançant Whiptail avec l’option --checklist. La syntaxe que nous devons utiliser est similaire à celle de --menu, sauf que pour chaque choix, nous devons spécifier le statut de la case à cocher, comme vous pouvez le voir dans l’exemple suivant :
whiptail \
--checklist "What are your favorite shells?" 10 40 3 \
"Bash" "(Bourne Again shell)" 1 \
"Zsh" "(Z-Shell)" 0 \
"Dash" "(Dash shell)" 0
Comme vous pouvez le voir, pour chaque entrée de menu, nous avons fourni :
- Une balise
- Une description
- L’état de la case à cocher : ici 0 et 1 signifient respectivement coché et décoché
L’utilisateur peut naviguer à l’aide des touches HAUT et BAS dans le menu, et sélectionner/désélectionner des entrées à l’aide de la touche ESPACE. Les choix sélectionnés sont imprimés, séparés par des espaces, à l’erreur standard, comme d’habitude.
Conclusions
Dans ce tutoriel, nous avons vu comment installer Whiptail sur certaines des distributions Linux les plus utilisées, et nous avons appris à l’utiliser pour afficher des widgets d’interface utilisateur textuels à partir de nos scripts shell. Nous avons créé des widgets d’entrée et nous avons appris à récupérer et à stocker les choix de l’utilisateur. Ici, nous n’avons fait qu’effleurer la surface de ce que nous pouvons faire avec Whiptail ; Vous pouvez en savoir plus en lisant le manuel.






