Eingaben müssen aus einer Datei und auch vom TTY umgeleitet werden

Eingaben müssen aus einer Datei und auch vom TTY umgeleitet werden

Ich verwende Amanda für meine Backups. Ich muss eine Reihe von Dateien mit unterschiedlichen Daten wiederherstellen. Die Dateien haben den gleichen Namen, daher muss ich mehrere Wiederherstellungssitzungen durchführen. Also dachte ich, ich könnte das Ganze in einem Skript dokumentieren. Hier ist mein Skript:

sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract

Ich führe das Skript mithilfe der Shell-Umleitung aus:

amrecover my_Config < /home/me/thatScript

Das Problem ist, dass sobald amrecover sieht,ExtraktBefehl, ich werde um Bestätigung gebeten.

Continue? [Y/n]:

Das Einfügen von „Y“ in die Zeile nach „extract“ funktioniert nicht. Amrecover sitzt da und wartet darauf, dass ich „Y“ eingebe. Ich nehme an, dass Amrecover die Eingabe vom TTY und nicht nur von Stdin haben möchte.

Ich habe mir die Manpage für amrecover angesehen und auch gegoogelt, um zu sehen, ob das schon jemand herausgefunden hat. Und da der Code kompiliert ist, kann ich kein Skript hacken, um nicht auf die Bestätigung zu warten.

Gibt es eine Möglichkeit, Eingaben sowohl aus einem Skript zu übernehmen als auch /dev/tty auf stdin umzuleiten?

Antwort1

amrecoverist als interaktives Skript gedacht, daher können Sie es traditionell automatisieren, indem Sie verwenden expect. Dieses tclDienstprogramm kann so konfiguriert werden, dass es die Konversation auf die beiden Eingabeaufforderungsstile ( amrecover>und Continue? [Y/n]:) überprüft und unterschiedlich darauf antwortet. Erstellen Sie beispielsweise eine Datei myrecoverin Ihrem PATH, machen Sie sie ausführbar ( chmod +x myrecover) und fügen Sie Folgendes ein:

#!/usr/bin/expect
spawn amrecover my_Config 
expect   -ex {Continue? [Y/n]:}  { send "y\r"; exp_continue } \
         -ex {amrecover>}        { gets stdin input; 
               if ![eof stdin] { send $input; send "\r"; exp_continue } }
close
wait

Führen Sie es dann als

./myrecover </home/me/thatScript

Das expectSkript verzweigt sich und führt Ihren Befehl aus amrecover my_Config, stellt über ein pty eine Verbindung dazu her und wartet dann auf die Eingabe, um nach den beiden Eingabeaufforderungen zu suchen. Wenn die übliche amrecover>Eingabeaufforderung angezeigt wird, lesen wir eine Zeile aus der Standardeingabe des expectSkripts, also Ihren Befehlssatz, und (wenn wir das Dateiende nicht erhalten haben) senden wir diese Zeile mit einem Zeilenumbruch an das Programm ( \rwird in dies umgewandelt). Dadurch exp_continuewird der Befehl erneut in einer Schleife ausgeführt, um die nächste Eingabeaufforderungsübereinstimmung zu erhalten. Am Dateiende schließen wir die Verbindung zum Programm und warten, bis es beendet wird.

Beachten Sie, dass amandadiese Vorgehensweise zu Problemen führen kann, wenn die Aufforderung zum Fortfahren auf eine Ausnahmebedingung usw. zurückzuführen ist.

Antwort2

Geben Sie die Eingabe für das extractDienstprogramm heredocwie gezeigt ein:

extract - <<\__DATA__
Y
__DATA__

verwandte Informationen