Mit dem Linux-Befehl wait können Sie Interaktionen mit Skripten und Programmen automatisieren. Sie können jede Art von Antwort an das Skript senden, wenn es eine Texteingabe erwartet.
Automatisierung bedeutet Effizienz
Wenn Sie einen Linux-Computer oder eine Computergruppe verwalten, Sie werden auf viele sich wiederholende Aufgaben stoßen. Die offensichtliche Lösung besteht darin, ein Skript zu schreiben, das die meiste Arbeit für Sie erledigt.. Der Shell-Bash, wie alle modernen Muscheln, bietet ein reichhaltige und flexible Skriptsprache.
Das Skripting eines mühsamen oder langwierigen Jobs gibt Ihnen die Flexibilität, diese Aufgabe auszuführen, wenn das Büro geschlossen ist oder in ruhigeren Phasen eines Betriebs. 24 Stunden des Tages, das 7 wochentags. Skripte geben Ihnen auch Wiederholbarkeit. Sie werden nicht vergessen, einen Schritt zu tun, egal wie oft sie gebeten werden, die gleichen langweiligen Aufgaben zu erledigen.
Das ist in Ordnung, so weit wie möglich. Aber wenn Ihr Skript eine Benutzerinteraktion erfordert, oder wenn Sie ein Programm aufrufen, das menschliche Beteiligung erfordert, Was kannst du tun? Du willst dich nicht vorstellen müssen, wenn das Skript läuft, oder wenn du anwesend bist, Schauen Sie sich das Terminalfenster an, das bereit ist, hineinzuspringen und einige Tasten zu drücken.
Linux hat die yes
Befehl, die eine Zeichenfolge sendet “und” oder eine andere vom Benutzer angegebene Zeichenfolge zum Terminalfenster. Ob ein Programm auf eine Antwort auf eine Ja- oder Nein-Frage wartet, Einer der Charaktere wird erzwungen “und”. Sie akzeptieren es als Eingabe und können fortfahren. Sie müssen die Ausgabe von weiterleiten yes
im Skript.
Jawohl | script.sh
Möglicherweise möchten Sie keine bejahende Antwort senden. Vielleicht müssen Sie sagen “Nein”. Das kannst du auch machen, Verwendung der yes
Befehl. Sie können jede gewünschte Phrase senden, Sie sind nicht auf Antworten wie “und”, “UND”, “Jawohl”, “n”, “n” Ö “Nein”.
Vielleicht müssen Sie eine “R” Gehen Sie folgendermaßen vor, um eine “install/upgrade/reinstall [i/u/r]
” jetzt.
ja r
das yes
Der Befehl kommt nicht zurecht, wenn Sie mehr als eine Antwortart angeben müssen. Für diese Situation, wir müssen verwenden expect
.
VERBUNDEN: So verwenden Sie den Befehl yes in Linux
Befehlsinstallation warten
Wir testeten expect
unter Ubuntu, Fedora und Manjaro. Das Paket war nicht in diesen Distributionen enthalten, also musste er sich niederlassen. In Ubuntu schreiben:
sudo apt installieren erwarten
In Fedora, Der Befehl, den Sie brauchen, ist:
sudo dnf installieren erwarten
In Manjaro verwenden wir pacman
:
sudo pacman -Sy erwarte
Wie wartet?
das expect
Mit dem Befehl können Sie die beiden Enden der Konversation zwischen Ihren vorbereiteten Antworten und dem Programm oder Skript verwalten, an das Sie sie senden. Dafür, erstellt ein Skript “Erwartet” die im Hauptskript nach Anweisungen sucht und für jede die richtige Lösung sendet.
Angenommen, Sie haben ein Sicherungsskript, das einen Quellverzeichnisnamen und einen Zielverzeichnisnamen anfordert. Nächste, erstellt eine Kopie der Dateien im Quellverzeichnis in das Zielverzeichnis. Ohne die Bits, die die Datei kopieren, Ihr Skript könnte wie folgt aussehen:
#!/bin/bash echo "Zu sicherndes Verzeichnis?" read source_directory echo "Speicherort der Sicherung?" read target_directory echo echo "Zielverzeichnis:" $target_directory
Dieses Skript fragt lediglich nach den Pfaden zu den beiden Verzeichnissen. Drucken Sie das Zielverzeichnis im Terminalfenster aus, damit wir sehen können, dass Sie eine Antwort von erhalten haben expect
und dass ich es richtig lesen konnte.
Um die andere Hälfte des Gesprächs bereitzustellen, Wir schaffen eine “Erwartetes Skript”. Vereinbarungs, Diese haben eine Erweiterung “.Exp”. Dieses Beispiel funktioniert mit unserem Skript “backup.sh”.
#!/usr/bin/expect -f set timeout -1 spawn ./backup.sh expect "Zu sicherndes Verzeichnis?R" Senden -- "/home/dave/Dokumente/r" erwarten "Speicherort der Sicherung?R" Senden -- "/media/dave/extern/backupr" erwarte eof
Dies zeigt die drei Hauptbefehle in den Warteskripten, das spawn
, expect
, und send
Befehle.
Als erstes fällt auf es ist der Schuppen bezieht sich auf expect
, Nein bash
. das -f
(Datei) die flagge sagt expect
die Antworten kommen aus einer Datei.
effektiv, Wir deaktivieren Timeouts, indem wir sie mit auf unendlich setzen -1.
das spawn
Befehl startet Backup-Skript.
Wir kennen die beiden Fragen, die uns das Skript "backup.sh" stellen wird.. Für jede Frage erstellen wir eine Zeile von “Abwarten”. Diese enthalten die Textnachricht, die über das Skript an das Terminalfenster gesendet wird “backup.sh”. Das ist was expect
das programm wird aufmerksam. Wann expect
siehe die Nachricht, der Text in der send
Die Zeile wird an das Skript zurückgegeben “backup.sh”.
das expect eof
die zeilen sagen expect
nach Abschluss der Verarbeitung im automatisierten Skript auf das Ende der endgültigen Datei warten.
Beide Skripte ausführbar machen:
chmod +x backup.sh
chmod +x backup.exp
Und verwenden Sie das Skript “backup.exp” , um den gesamten Vorgang zu starten.
./backup.exp
Sie können die beiden Hinweise von “backup.sh” und die Antworten von “backup.exp”.
Das wird schnell fummelig
Es ist cool zu sehen, wie zwei Skripte so interagieren, mit den automatischen Antworten, die von unserem Warteskript gesendet und vom automatisierten Skript als echte Eingabe akzeptiert werden. Dies ist nur ein einfaches Beispiel, entschieden. Wenn Sie versuchen, ein langes Verfahren zu automatisieren, und sie sind diejenigen, die Sie automatisieren möchten, wird bald stecken bleiben.
Der Text im expect
die Zeilen müssen genau mit den Eingabeaufforderungen des Skripts übereinstimmen, das Sie automatisieren. Rechtschreibfehler und falsche Formulierungen führen dazu, dass eine Nachricht übersprungen wird und der automatisierte Vorgang beendet wird. Wenn Sie das Skript, das Sie automatisieren möchten, noch entwickeln oder ändern, der Wortlaut der Aufforderungen und ihre Reihenfolge innerhalb des Skripts werden sich wahrscheinlich ändern. Skript- oder Programmupdates können sich ändern, Nachrichten entfernen oder einfügen. Änderungen zu verfolgen und in Ihrem erwarteten Skript zu replizieren, wird mühsam und fehleranfällig.
Der bequemste Weg, ein Warteskript zu erstellen, ist die Verwendung von autoexpect
. Dies wird zusammen mit installiert expect
. Wir können sagen autoexpect
um unsere Interaktion im wirklichen Leben mit einem Skript oder Programm zu überwachen, und generieren Sie eine Wartedatei für uns.
Möglicherweise müssen einige Arbeiten in der generierten Wartedatei ausgeführt werden, aber es geht viel schneller als mit der Hand zu schreiben. Als Beispiel, wenn Sie etwas in Ihrer Sitzung falsch schreiben, während Autoexpect es überwacht, falsche Tastenanschläge werden erfasst und ihre Bearbeitung und Rücktaste, um sie zu korrigieren. Um das zu beheben, Löschen Sie einfach diesen Abschnitt und schreiben Sie den richtigen Text.
Autoexpect verwenden
Verwenden von autoexpect
Es ist leicht. Wir nehmen das -f
(Dateiname) um den Namen der erwarteten zu erstellenden Datei und des Programms oder Skripts anzugeben, das wir ausführen möchten. Verfahrensanweisungen und unsere Antworten werden protokolliert und an die Vormerkdatei gesendet. Wie eine nette Geste, autoexpect
macht die Wait-Datei für uns ausführbar.
Sagen wir, wir verwenden oft rsync
um Dateien von einem Computer an . zu senden ein Verzeichnis auf einem anderen Computer über Netzwerk. wir werden verwenden autoexpect
um eine Wartedatei für diese Prozedur zu erstellen.
Unsere Kommandozeile sieht so aus. Der erste Befehl ist autoexpect
Gefolgt von der -f
Flag und den Namen der Wait-Datei, die wir erstellen möchten. Unter diesen Umständen, es ist “send-pics.exp”.
Der Rest des Befehls ist der reguläre rsync
Befehl. Weil rsync
benutze die SSH
Protokoll für Remote-Verbindung zum Zielcomputer herstellen, Wir müssen das Passwort für das Benutzerkonto angeben “dave” auf dem Zielcomputer.
autoexpect -f send-pics.exp rsync -rasv ~/Pictures/raw/ [email protected]:/home/dave/roh/
Wenn wir diesen Befehl ausführen rsync
Es startet und wir werden nach dem Passwort für das Dave-Benutzerkonto auf dem Remote-Computer gefragt. Sobald Sie eintreten, einige Dateien werden an den Remote-Computer gesendet, rsync
bricht die Verbindung ab und die Prozedur endet.
Uns wird gesagt, dass die Datei erstellt wurde “send-pics.exp”. Wir werden sehen:
ls -l send-pics.exp
Genau genommen, wurde erstellt und ist ausführbar. Wir können es ausführen, indem wir es beim Namen nennen:
./send-pics.exp
Diesmal, das Verfahren läuft ohne menschliches Zutun. Alle neuen Dateien seit der letzten Übertragung werden an den Remote-Rechner gesendet.
Dies ist ein sehr kleines Beispielskript. Es spart kaum Kraft im Vergleich zum Betreiben des rsync
Handbefehl. Obwohl das stimmt, veranschaulicht den Punkt, dass es sowohl Programme als auch Skripte steuern kann, und Sie können die hier gezeigten Prinzipien auf Skripte oder Prozesse beliebiger Länge anwenden.
VERBUNDEN: So sichern Sie Ihr Linux-System
Warten, mein Passwort!
Sie sollten darauf achten, dass jedes Passwort, oder andere vertrauliche Informationen, gesammelt während a autoexpect
Die Sitzung wird im generierten Warteskript im Klartext gespeichert. Passwörter sollten nirgendwo im Klartext geschrieben werden. Für SSH-Verbindungen, eine bessere Lösung ist die Verwendung von SSH-Schlüsseln und ein passwortloses Authentifizierungsschema haben.
Offensichtlich, das hilft nicht, wenn du kein SSH verwendest.
Sie können Ihr Warteskript bearbeiten und die Zeile mit Ihrem Passwort in ändern:
interagieren ++ Rückkehr
Wenn das Skript diese Zeile erreicht, wird auf deine Eingabe warten, mit dem Sie Ihr Passwort eingeben können. Die Steuerung kehrt anschließend zum erwarteten Skript zurück, sobald Sie Ihr Passwort angegeben haben.
./send-pics.exp
Aber das stellt ein anderes Hindernis dar. Das bedeutet, dass Ihr Skript nicht mehr unbeaufsichtigt geöffnet werden kann. Wenn Sie Ihr Skript immer manuell starten möchten, es ist wahrscheinlich egal, vor allem, wenn die Passwortabfrage direkt am Anfang des Skripts erfolgt. Sie können das Skript starten, Geben Sie Ihr Passwort ein und lassen Sie es sich selbst überlassen.
Eine andere Möglichkeit, das Problem anzugehen, ist:
- Dateiberechtigungen ändern in Ihrem erwarteten Skript mit
chown
al 740,-rwxr-x---
. - Verwenden
chmod
um den Gruppenbesitzer vom Warteskript in eine vertrauenswürdige Gruppe zu ändern. - Erstellen Sie ein reguläres Skript, das Ihr erwartetes Skript startet. Konfigurieren Sie diese Datei so, dass sie auch der Vertrauensgruppe gehört. Legen Sie die Berechtigungen dafür fest in 2751,
-rwxr-s--x
. - Dadurch wird ein Startskript erstellt, das jeder lesen und ausführen kann, die sich in derselben Vertrauensgruppe wie das Warteskript befindet, und mit seiner
setgid
Bit gesetzt. Unabhängig davon, wer dieses Skript ausführt, Ihre effektive Gruppe ist die vertrauenswürdige Gruppe und nicht die Gruppe der Person, die das Skript ausführt. Weil, Dieses Skript kann das Warteskript immer ausführen. - In der Zwischenzeit, Das Warteskript, das das Passwort enthält, ist für niemanden außer Ihnen zugänglich.
VERBUNDEN: So verwenden Sie SUID, SGID und Sticky Bits unter Linux
Sie können tolle Dinge erwarten
Hier ist genug, um dich in Schwung zu bringen, aber es gibt noch viel mehr zu expect
dass die Bereiche, die wir abgedeckt haben. das expect
Die Manpage hat mehr als 1700 Linien!
Für Aufgaben wie automatisierte Installationen, geplante Backups oder sich wiederholende Bereitstellungen, Warten wird Ihren Workflow verändern.