Website-Suche

So integrieren Sie Dialogfelder in Shell-Skripte mit Whiptail


Die Möglichkeit, sichere Shell-Skripte zu erstellen, ist nicht nur für Systemadministratoren unerlässlich, sondern auch für Benutzer, die sich wiederholende Aufgaben automatisieren möchten. Manchmal müssen wir aus unseren Shell-Skripten dem Benutzer irgendeine Art von Informationen zur Verfügung stellen, ihn bitten, einige Eingaben zu machen, aus einer Reihe von Alternativen auszuwählen oder einfach um seine Bestätigung zu bitten, bevor wir eine potenziell gefährliche Operation durchführen. All diese Aktionen können natürlich von der Befehlszeile aus ausgeführt werden, aber um unsere Skripte benutzerfreundlicher zu gestalten, können wir Whiptail verwenden, um textuelle Widgets anzupassen und anzuzeigen.

In diesem Artikel sehen wir, wie wir unsere Skripte benutzerfreundlicher gestalten können, indem wir textuelle Widgets verwenden, die mit Whiptail erstellt wurden.

In diesem Tutorial lernen Sie:

  • So installieren Sie whiptail und die newt-Bibliothek in einigen der am häufigsten verwendeten Linux-Distributionen
  • Wie man whiptail verwendet, um textuelle Widgets für die Benutzeroberfläche aus unseren Shell-Skripten zu erstellen
  • So verwenden Sie das Messagebox-Widget, um eine einfache Nachricht anzuzeigen
  • So verwenden Sie das yesno-Widget, um dem Benutzer die Möglichkeit zu geben, eine binäre Auswahl zu treffen
  • So erhalten Sie Benutzereingaben mit den Widgets inputbox und passwordbox
  • So erstellen Sie Menüs mit den Menü- und Checklisten-Widgets

Installation

Whiptail und die "newt"-Bibliothek sind freie und quelloffene Software. Ähnlich wie dialogue und die ncurses-Bibliothek können sie verwendet werden, um textuelle Widgets aus Shell-Skripten anzuzeigen. Whiptail ist in den Repositories aller am häufigsten verwendeten Linux-Distributionen verfügbar. Um es auf Fedora zu installieren, können wir Folgendes ausführen:

sudo dnf install newt

Auf Debian und anderen Debian-basierten Linux-Distributionen installieren wir stattdessen das Paket whiptail direkt. Wir können dies mit apt tun:

sudo apt install whiptail

Unter Archlinux müssen wir stattdessen, um Whiptail zu erhalten, das libnewt-Paket installieren, das Teil des "Community"-Repositorys ist. Wir führen die Installation mit dem Paketmanager pacman durch:

sudo pacman -Sy libnewt

So verwenden Sie Whiptail zum Anzeigen von Widgets

Wir können Whiptail verwenden, um unsere interaktiven Shell-Skripte benutzerfreundlicher zu gestalten. Sehen wir uns ein Beispiel für seine Verwendung an.

Anzeigen einer einfachen Meldung

In unserem ersten Beispiel zeigen wir, wie Sie Whiptail verwenden, um dem Benutzer eine einfache Nachricht anzuzeigen. Um dies zu tun, starten wir den Befehl mit der Option --msbox. Als Argumente für den Befehl geben wir an:

  1. Der Text, der dem Benutzer angezeigt werden soll
  2. Die Höhe des Widgets (ausgedrückt in Zeilen)
  3. Die Breite des Widgets (ausgedrückt in Spalten)
whiptail --msgbox "This is a simple message!" 10 30

Hier ist das Widget, das durch den Befehl erzeugt wird:

Anzeigen eines Ja/Nein-Dialogs

Um einem Benutzer eine Art Nachricht anzuzeigen und ihn eine einfache "binäre" Auswahl treffen zu lassen, können wir whiptail mit dem Flag --yesno starten. Die Argumente, die wir angeben müssen, sind die gleichen, die wir im vorherigen Beispiel verwendet haben. Hier erstellen wir einen Dialog, mit dem wir den Benutzer um Bestätigung bitten können:

whiptail --yesno "Are you sure you want to perform the action?" 10 30

Hier ist die Ausgabe, die durch den Befehl erzeugt wird:

Wir können die vom Benutzer gewählte Auswahl bestimmen, indem wir den Exit-Code des Befehls überprüfen, der in der Shell-Variablen $? gespeichert ist: Er ist 0, wenn die bejahende Antwort ausgewählt wird, andernfalls 1.

Bitte um Input

Im vorherigen Beispiel haben wir das "yesno"-Widget verwendet, um den Benutzer aufzufordern, eine binäre Auswahl zu treffen. In bestimmten Situationen müssen wir den Benutzer möglicherweise bitten, eine allgemeinere Eingabe in Form einer Zeichenfolge bereitzustellen. Nehmen wir zum Beispiel an, wir möchten den Benutzer bitten, einen "Benutzernamen" anzugeben. Um diese Aufgabe zu erfüllen, starten wir Whiptail mit der Option --inputbox. Die Argumente, die wir angeben müssen, sind die gleichen, die wir in den vorherigen Beispielen gesehen haben, plus ein optionales, [init]: Wir können es verwenden, um einen "Platzhalter" für die Eingabe anzugeben. Hier ist ein Beispiel:

whiptail --inputbox "What is your username?" 10 30 "root"

Der Befehl erzeugt das folgende Dialogfeld:

Wie kann ich die Benutzereingabe abrufen oder speichern? Wenn der Benutzer "Ok" drückt, wird die von ihm angegebene Eingabe als Standardfehler ausgegeben. Angenommen, wir wollen die Eingabe in einer Variablen "speichern", würden wir Folgendes ausführen:

username="$(whiptail --inputbox "What is your username?" 10 30 "root" 3>&1 1>&2 2>&3)"

Was bedeuten all diese Umleitungen am Ende des Befehls? Wie wir wissen, gibt es drei Dateideskriptoren, die von der Shell verwendet werden: Standardeingabe (0), Standardausgabe (1) und Standardfehler (2). Whiptail verwendet den Standard-Ausgabedateideskriptor, um Widgets anzuzeigen, und druckt, wie bereits erwähnt, die Eingabe des Benutzers auf den Standardfehler. Wenn wir den Befehlsersetzungsmechanismus verwenden, wird ein Befehl durch seine Ausgabe ersetzt, die wir normalerweise in einer Variablen speichern.  In diesem Fall möchten wir jedoch den vom Befehl erzeugten Standardfehler in der Variablen speichern, daher müssen wir die Standardausgabe und den Standardfehler vertauschen, um unser Ziel zu erreichen. Wie können wir das tun?

Wenn wir eine Umleitung durchführen, duplizieren wir einen Dateideskriptor in einen anderen. Zum Beispiel, wenn wir schreiben:

1>&2

Was wir sagen ist: "Verwenden Sie ein Duplikat des Standard-Fehlerdatei-Deskriptors (2) für die Standardausgabe". Um die Deskriptoren für die Standardausgabe und die Standardfehlerdatei zu vertauschen, können wir daher schreiben:

3>&1 1>&2 2>&3

Mit diesen Weiterleitungen gehen wir wie folgt vor:

  1. Duplizieren Sie den Dateideskriptor 1 (Standardausgabe) in den Dateideskriptor 3
  2. Duplizieren von Dateideskriptor 2 (Standardfehler) mit Dateideskriptor 1 (Standardausgabe)
  3. Duplizieren Sie den Dateideskriptor 3 (den wir im ersten Schritt zu einem Duplikat der ursprünglichen Standardausgabe gemacht haben) in den Dateideskriptor 2 (Standardfehler)

Mit anderen Worten, wir haben einfach den Standardfehler und die Standardausgabe vertauscht. Wir haben einen extra Dateideskriptor (3) als "temporären Ort" verwendet, um die ursprüngliche Standardausgabe zu speichern, die sonst verloren gegangen wäre. An dieser Stelle wird die Zeichenfolge, die vom Benutzer als Eingabe eingegeben wurde, in der Standardausgabe ausgegeben und, da wir die Befehlsersetzung verwendet haben, in der Variablen "Benutzername" "gespeichert":

echo $username
root

Aufforderung an den Benutzer, ein Kennwort einzugeben

Der Dialog "Passwort" funktioniert ähnlich wie der "Eingabe"-Dialog: Der einzige Unterschied besteht darin, dass die vom Benutzer eingegebenen Zeichen aus Sicherheitsgründen nicht während der Eingabe angezeigt werden. Um einen Passwortdialog zu erstellen, starten wir Whiptail mit der Option --passwordbox. Hier speichern wir, genau wie im vorherigen Beispiel, die Eingabe in einer Variablen:

password="$(whiptail --passwordbox "Please enter your password:" 10 30 3>&1 1>&2 2>&3)"

Das Widget, das mit dem Befehl generiert wird:

Anzeigen eines Menüs

Das Menüfeld wird durch Starten von whiptail mit der Option --menu erstellt und kann verwendet werden, um dem Benutzer die Möglichkeit zu geben, einen Eintrag aus einer Liste von Alternativen auszuwählen. Als Argumente für die Option geben wir die üblichen Argumente plus die menu-height und ein Tag/Item-Paar für jede Option an, die wir in das Menü aufnehmen möchten. Das "Tag " steht für den Namen der Wahl, das "item " ist eine Beschreibung davon. Hier ist ein Beispiel:

whiptail \
  --menu "What is your favorite shell?" 10 35 2 \
  "Bash" "(Bourne Again shell)" \
  "Zsh"  "(Z-Shell)"

Hier ist das Ergebnis des Befehls:

Der Benutzer kann mit den Tasten UP und DOWN im Menü navigieren. Der Eintrag, den er auswählt, wird in den Standard-Fehlerdeskriptor gedruckt, sobald er <Ok> drückt.

Dem Benutzer die Möglichkeit geben, mehr als eine Auswahl zu treffen

Wenn das "Menü"-Widget verwendet wird, darf der Benutzer nur einen der von uns bereitgestellten Einträge auswählen. Wenn wir eine Mehrfachauswahl zulassen möchten, müssen wir das Widget "Checkliste" verwenden. Wir können es generieren, indem wir Whiptail mit der Option --checklist starten. Die Syntax, die wir verwenden müssen, ist ähnlich wie die von --menu, außer dass wir für jede Auswahl den Status des Kontrollkästchens angeben müssen, wie Sie im folgenden Beispiel sehen können:

whiptail \
  --checklist "What are your favorite shells?" 10 40 3 \
  "Bash" "(Bourne Again shell)" 1 \
  "Zsh"  "(Z-Shell)" 0 \
  "Dash" "(Dash shell)" 0

Wie Sie sehen können, haben wir für jeden Menüeintrag Folgendes bereitgestellt:

  1. Ein Tag
  2. Eine Beschreibung
  3. Der Status der Checkbox: Hier bedeutet 0 und 1 aktiviert bzw. deaktiviert

Der Benutzer kann mit den Tasten UP und DOWN durch das Menü navigieren und mit der LEERTASTE Einträge auswählen/abwählen. Die ausgewählten Auswahlmöglichkeiten werden wie üblich mit Leerzeichen getrennt gedruckt.

Schlüsse

In diesem Tutorial haben wir gesehen, wie man Whiptail auf einigen der am häufigsten verwendeten Linux-Distributionen installiert, und wir haben gelernt, wie man es verwendet, um textuelle Benutzeroberflächen-Widgets aus unseren Shell-Skripten anzuzeigen. Wir haben einige Eingabe-Widgets erstellt und gelernt, wie man die Benutzerauswahl abruft und speichert. Hier haben wir nur an der Oberfläche dessen gekratzt, was wir mit Whiptail machen können; Weitere Informationen finden Sie im Handbuch.

Verwandte Artikel: