Simulation des ENTER-Tastendrucks im Bash-Skript

96

Ich habe ein wirklich einfaches Bash-Skript erstellt, das einige Befehle ausführt. Einer dieser Befehle benötigt zur Laufzeit Benutzereingaben. dh es fragt den Benutzer "Willst du bla bla bla?", ich möchte einfach eine Eingabetaste senden, damit das Skript vollständig automatisiert wird.

Ich muss zur Laufzeit nicht auf die Eingabe oder irgendetwas warten, es reicht aus, nur den Tastendruck zu senden, und der Eingabepuffer erledigt den Rest.

tobbr
quelle
1
Wenn das zu automatisierende Tool das ist apt-get, besteht die richtige Lösung darin, die Debconf-Datenbank mit Ihren bevorzugten Werten vorab festzulegen. dann wird es dich nicht fragen.
Tripleee
Sie könnten printf anstelle von echo verwenden: printf "hallo \ n"
hassanzadeh.sd

Antworten:

132
echo -ne '\n' | <yourfinecommandhere>

oder die implizite Newline nutzen, die das Echo erzeugt (danke Marcin)

echo | <yourfinecommandhere>

Jetzt können wir einfach die --skOption verwenden:

--sk, --skip-keypressSie für einen Tastendruck nicht nach jedem Test warten

dh sudo rkhunter --sk --checkall

Tilman Vogel
quelle
1
Wenn Sie diese Ausgabe eingeben, erhalten xxdSie 5c6ehex, was ein Literal ist \n. Wenn Sie dies nur tun, erhalten echo | xxd Sie tatsächlich ein Hex von 0a. Ich denke also, verwenden Sie, was auch immer Ihr Programm benötigt.
Marcin
3
@Marcin, ich bin überrascht, ich bekomme 0a0awas immer noch nicht wie beabsichtigt ist, das Hinzufügen eines -nSuppreses die implizite Newline. Aber Sie haben natürlich Recht, eine Ebene echo | ...funktioniert hier gut. Wird meine Antwort aktualisieren.
Tilman Vogel
Heh, es sah für mich nicht ganz richtig aus, also musste ich es durch xxd füttern. Dies ist bei weitem die einfachste und effizienteste Methode, um genau zu sehen, welche Befehle ausgegeben werden. Ich muss dumme Unix-Tricks lieben.
Marcin
@Marcin, immer noch, warum bekommst du 5c6e? Haben Sie die Option -eausgelassen oder echobehandelt Ihre Shell diese Option nicht?
Tilman Vogel
Ich verstehe: echo -ne "\n" | xxd 0000000: 0a und echo -n "\n" | xxd 0000000: 5c6e und echo "\n" | xxd 0000000: 5c6e 0a ich habe keinen Unterschied zwischen einfachen und doppelten Anführungszeichen gesehen. Meine Shell ist nur eine normale Bash. Gibt es Einstellungen, die das Verhalten solcher grundlegenden Funktionen regulieren würden?
Marcin
43

Möglicherweise ist der yesBefehl hilfreich.

Sehen man yes

Pavium
quelle
54
yesIch finde es nützlich.
Pureferret
2
Dies simuliert das wiederholte Drücken von "y" anstelle der Eingabetaste. Während dies wahrscheinlich das ist, was Sie mit Ja / Nein-Fragen möchten, funktioniert es nicht für alles, was kein "y" erwartet.
Burhan Ali
5
@ BurhanAli: Sie können ändern, was yesals Ausgabe gesendet wird . Lesen Sie die Manpage.
Siride
1
kann ich ja mehrmals für ein Skript senden, das Standardwerte erwartet [Wert] {enter}
AK_
Dies funktioniert nur für Dinge wie lecker. Wo diese Zeichenfolge erwartet wird.
Einarc
22

Hier ist eine Beispielverwendung mit expect:

#!/usr/bin/expect
set timeout 360
spawn my_command # Replace with your command.
expect "Do you want to continue?" { send "\r" }

Überprüfen Sie: man expectfür weitere Informationen.

Kenorb
quelle
Besonders hilfreich, wenn mehrere Tastendrücke gesendet werden müssen
Andy
Dies ist der beste Weg, insbesondere für Dinge wie Phars, bei denen verschiedene stdout- und stdin-Strings gesendet werden.
Einarc
Denken Sie auch daran, einfach my_command arg einzugeben, wenn Sie ein Argument haben.
Einarc