Automatisieren Sie Eingaben in Linux-Skripte mit dem Befehl wait

Inhalt

Bash-Shell

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.

Passwort im Klartext im Warteskript gespeichert, im gedit-Editor

Sie können Ihr Warteskript bearbeiten und die Zeile mit Ihrem Passwort in ändern:

interagieren ++ Rückkehr

Interaktiver Befehl im Warteskript, im gedit-Editor

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.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.