
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
amrecover
ist als interaktives Skript gedacht, daher können Sie es traditionell automatisieren, indem Sie verwenden expect
. Dieses tcl
Dienstprogramm 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 myrecover
in 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 expect
Skript 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 expect
Skripts, also Ihren Befehlssatz, und (wenn wir das Dateiende nicht erhalten haben) senden wir diese Zeile mit einem Zeilenumbruch an das Programm ( \r
wird in dies umgewandelt). Dadurch exp_continue
wird 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 amanda
diese 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 extract
Dienstprogramm heredoc
wie gezeigt ein:
extract - <<\__DATA__
Y
__DATA__