Nur wenige Systemadministratoren in der Linux-Welt müssen von der Leistungsfähigkeit und Bedeutung von Skripten überzeugt werden. Skripts sind überall und Sie wissen, dass sie für die Linux-Systemverwaltung unerlässlich sind. Viele Skripte werden im Hintergrund ausgeführt, auch wenn sie manuell von einem Benutzer oder Administrator initiiert werden.
Einige Skripte geben jedoch Informationen an Benutzer weiter oder erbitten Informationen von ihnen. Sie können Skriptfunktionen wie echo
verwenden oder read
um diese Ziele zu erreichen. Leider zeigt keines dieser Tools die Informationen auf ausgefallene Weise oder auf eine Weise an, die die Aufmerksamkeit des Benutzers erregt.
Whiptail fügt Ihren Skripten ein interaktiveres Dialogfeld hinzu. Diese Felder bieten Informationen, erbitten Eingaben oder erzwingen eine Bestätigung. Der angezeigte Inhalt ist im Format einer textbasierten Benutzeroberfläche (TUI) und wird mit der Registerkarte navigiert Schlüssel. Auswahlen werden mit der Leertaste getroffen Schlüssel.
In diesem Artikel führe ich Sie durch die Installation von whiptail
(es ist einfach!) und demonstrieren Sie dann ein paar grundlegende Beispiele.
[ Den Lesern gefiel auch: Welche Programmiersprachen sind für Systemadministratoren nützlich? ]
Whiptail installieren
Die Installation ist einfach. Ich verwende Fedora 33 für diese Beispiele. Whiptail ist Teil der größeren Newt-Bibliothek, die TUI-Fenstern Funktionalität hinzufügt.
Installieren Sie whiptail
indem Sie den folgenden Befehl verwenden:
[damon@localhost ~]$ sudo dnf install newt
Das war's für die Installation.
In diesem Artikel erstellen Sie einzelne vim-Dateien mit dem Whiptail-spezifischen Code. Denken Sie daran, die folgenden Aufgaben für jede demonstrierte Datei auszuführen:
- Bennen Sie es deutlich
- Machen Sie es ausführbar, indem Sie
chmod 744 demo.sh
eingeben - Führen Sie es mit
./
aus vor dem Dateinamen, wenn der Speicherort nicht auf dem PATH liegt
Hinweis :Ich nehme vim an, weil ich es bevorzuge. Nano oder ein anderer Texteditor ist ausreichend.
Als Nächstes ist es an der Zeit, einige Skripte einzubeziehen.
Ein einfaches Dialogfeld anzeigen
Sie brauchen eigentlich kein Skript, um ein einfaches Dialogfeld von whiptail
anzuzeigen . In diesem Beispiel deklarieren Sie eine Variable und rufen sie dann auf. Die Variable ist lediglich eine Art Meldung, die mit einem OK quittiert wird Taste. Es werden keine Auswahlmöglichkeiten angeboten und es wird keine Navigation verwendet.
Geben Sie an der Eingabeaufforderung die folgenden Informationen ein:
[damon@localhost ~]$ message="Today, we will learn about Whiptail."
[damon@localhost ~]$ whiptail --msgbox --title "Intro to Whiptail" "$message" 25 80
Sobald die Benutzeroberfläche angezeigt wird, beachten Sie, dass der von Ihnen angegebene Titel in der oberen Leiste angezeigt wird. Ihre Nachricht ist auch vorhanden. Das OK Schaltfläche ist verfügbar. Im whiptail
Befehl, Sie haben zwei eingegeben
Werte:25 und 80 . Diese Werte sind Säulenmessungen und können angepasst werden. Sie definieren die Größe des Schnittstellenfensters. Achten Sie darauf, eine Größe auszuwählen, die nicht den gesamten Bildschirm einnimmt und verhindert, dass der Nutzer die gesamte Nachricht sieht oder OK auswählt . Die meisten Terminalfenster werden auf 80 Spalten oder mehr eingestellt.
Wenn Sie alle Komponenten der Benutzeroberfläche beobachtet haben, wählen Sie OK durch Drücken der Enter Schlüssel.
In diesem Beispiel haben Sie zwei Optionen verwendet:--msgbox
und --title
Und jetzt ein interessanteres Beispiel.
Generieren Sie eine Abfrage
Es können Skripts geschrieben werden, die die Eingabe eines Nutzers akzeptieren. Wenn Sie ein Skript schreiben, das mit technisch nicht versierten Benutzern interagiert, kann es von Vorteil sein, eine benutzerfreundlichere Oberfläche zu erstellen. In diesem Beispiel werden dem Benutzer zwei Fragen gestellt:Name und Land.
Erstellen Sie eine Datei namens query.sh
mit folgendem Inhalt.
#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)"
Beachten Sie, dass Sie in diesem Beispiel --inputbox
verwendet haben statt --msgbox
. Sie haben den whiptail
organisiert Code als if/then-Anweisung.
Die 8 und 39 Werte definieren die Größe des Dialogfensters. Wenn Sie in Ihrer eigenen Laborumgebung weitermachen, ersetzen Sie 39 mit 10 , speichern Sie Ihre Änderungen und führen Sie whiptail
erneut aus Code. Sie werden sehen, dass das Dialogfeld zu klein ist, um nützlich zu sein. Verwenden Sie den Tab Taste, um Abbrechen auszuwählen , und setzen Sie dann den Größenwert zurück auf 39 ab 10 .
Vergessen Sie nicht, die Berechtigungen festzulegen, um die Datei ausführbar zu machen, und verwenden Sie ./
um es vom aktuellen Standort aus auszuführen.
[damon@localhost ~]$ chmod 777 query.sh
[damon@localhost ~]$ ./query.sh
Hier sehen Sie die Ergebnisse nach Abschluss des Dialogfelds:
Sie haben Benutzern Informationen über ein Nachrichtenfeld gegeben und Informationen vom Benutzer über ein Eingabefeld gesammelt. Stellen Sie dem Benutzer als Nächstes einige zusätzliche Fragen.
Erstellen Sie ein Ja/Nein-Dialogfeld
Es gibt viele Variationen, um Fragen an den Benutzer zu stellen. In diesem Fall verwenden Sie eine einfache Ja/Nein-Abfrage, um herauszufinden, ob heute Dienstag ist. Sie können dies tun, indem Sie eine Testdatei mit dem Namen tuesday.sh
erstellen und Platzieren des folgenden Inhalts darin:
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
Anstelle der --inputbox
oder --msgbox
In den vorherigen Beispielen haben Sie den --yesno
verwendet Möglichkeit. Wie das vorherige Beispiel ist auch dieses als Wenn/Dann-Abfrage organisiert.
Hier ist die resultierende Ausgabe:
Der --yesno
Box-Option erlaubt uns auch, den Inhalt der "Ja"- und "Nein"-Felder zu bearbeiten. Hier ist ein Beispiel:
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
Die einzige Änderung des Beispiels ist das Hinzufügen der beiden --no-button
und --yes-button
Optionen mit dem entsprechenden Text (in diesem Fall „Nicht Dienstag“ und „Dienstag“).
So sieht das resultierende Dialogfeld aus:
Eine letzte Sache. Whiptail sendet die Eingabe des Benutzers an stderr. Ja, Sie haben richtig gelesen:stderr und
nicht stdout, hier nehmen Sie die Eingaben des Nutzers auf, um sie im Skript zu verarbeiten. Der Weg, dieses Problem zu umgehen, besteht darin, die Umleitung umzukehren, sodass die Eingabe des Benutzers nach stdout geht.
Hier ist der Ausdruck dafür:
3>&1 1>&2 2>&3
Erklärung:
- Erstellen Sie einen Dateideskriptor 3, der auf 1 (stdout) zeigt
- Umleitung 1 (stdout) auf 2 (stderr)
- Leite 2 (stderr) auf den Dateideskriptor 3 um, der auf stdout zeigt
So sieht es in einem Skript-Snippet aus der obigen --inputbox
aus Beispiel:
NAME=$(whiptail --inputbox "What is your name?" 8 39 --title "Getting to know you" 3>&1 1>&2 2>&3)
[Kostenloser Spickzettel:Kubernetes-Glossar]
Abschluss
Ich habe einige grundlegende Beispiele gezeigt, aber whiptail
kann noch viel mehr. Ich habe hier genug bereitgestellt, um Ihnen den Einstieg zu erleichtern, und es gibt viele nützliche Tutorials online. Ihre Skripte benötigen eine Möglichkeit, die Eingaben der Benutzer zu verarbeiten. Ich empfehle Ihnen, Ihre interaktiven Skripts zu überprüfen, um festzustellen, ob das Hinzufügen von TUI-Dialogfeldern hilfreich wäre.
Hier ist eine Liste der primären Boxoptionen, die für whiptail
verfügbar sind :
- --Titel
- --infobox
- --msgbox
- --ja nein
- --Eingabefeld
- --Passwortfeld
- --Menü
- --Textfeld
- --Checkliste
- --Radioliste
- --Gauge