Argumente nicht interaktiv an ein interaktives Programm übergeben

113

Ich habe ein Bash-Skript, das den readBefehl verwendet, um Argumente für Befehle interaktiv zu lesen, zum Beispiel Ja / Nein-Optionen. Gibt es eine Möglichkeit, dieses Skript in einem nicht interaktiven Skript aufzurufen, das Standardoptionswerte als Argumente übergibt?

Es ist nicht nur eine Option, die ich an das interaktive Skript übergeben muss.

Sidharth Sharma
quelle
2
Wenn es von stdin liest, können Sie Ihre Eingabe
einleiten
4
Da diese Frage viele Duplikate enthält, ist darauf hinzuweisen, dass es keine Rolle spielt, in welcher Sprache das interaktive Programm geschrieben ist. Es kann sich um ein C-Programm handeln, das Standardeingaben liest, oder um eine Erlang-Anwendung oder was auch immer. Es gibt etwas, das über die Befehlszeile ausgeführt wird und widerlich interaktive Eingaben erfordert, und Sie möchten es automatisieren.
Tripleee
Wenn Sie die Kontrolle über die abscheuliche Anwendung haben, schreiben Sie sie natürlich neu, damit sie die Antworten nicht interaktiv lesen kann (über eine Konfigurationsdatei, Befehlszeilenoptionen oder was auch immer). Dies ist viel zuverlässiger und robuster gegen Änderungen der Reihenfolge oder des Wortlauts interaktiver Fragen.
Tripleee

Antworten:

46

Für komplexere Aufgaben gibt es expect( http://en.wikipedia.org/wiki/Expect ). Es simuliert im Grunde einen Benutzer. Sie können ein Skript codieren, wie auf bestimmte Programmausgaben und verwandte Dinge reagiert werden soll.

Dies funktioniert auch in solchen Fällen ssh, in denen das Weiterleiten von Passwörtern daran verboten ist.

Dani Gehtdichnixan
quelle
8
... Die richtige Lösung im SSH-Fall ist jedoch die Umstellung auf die Authentifizierung mit öffentlichem Schlüssel.
Tripleee
154

Viele Möglichkeiten

leiten Sie Ihre Eingabe weiter

echo "yes
no
maybe" | your_program

aus einer Datei umleiten

your_program < answers.txt

Verwenden Sie hier ein Dokument (dies kann sehr gut lesbar sein)

your_program << ANSWERS
yes
no
maybe
ANSWERS

Verwenden Sie eine Here-Zeichenfolge

your_program <<< $'yes\nno\nmaybe\n'
Glenn Jackman
quelle
5
Es ist darauf hinzuweisen, dass dies nur funktioniert, wenn das Programm die Standardeingabe liest. Einige Programme geben sich alle Mühe, z. B. Passwörter interaktiv zu lesen, selbst wenn die Standardeingabe eine Pipe ist. Für Passwörter ist dies aus Sicherheitsgründen sinnvoll. obwohl einige interaktive Programme einfach schlecht gestaltet sind.
Tripleee
@tripleee Wie liest ein Skript Passwörter, die nicht von stdin betroffen sind? Ich weiß, dass Sie readstdin greifen können. Welche Funktion können Sie verwenden, um das zu tun, was Sie beschrieben haben?
flow2k
In diesem Fall müssen Sie prüfen, ob das Programm, mit dem Sie interagieren möchten, über eine spezielle Methode verfügt, um die Eingabe an das Programm zu senden (z. B. sshpass, ssh-agent), oder ob Sie Expect verwenden, um die Interaktion zu skripten.
Glenn Jackman
2
Programme wie Expect führen den Client unter einer Pseudo-Tty aus, bei der es für den Client so aussieht, als ob sich am anderen Ende ein Benutzer mit einem Terminal und einer Tastatur befindet. Mit einer normalen Pfeife geht das nicht.
Tripleee
Wichtiger Hinweis. Dies funktioniert nicht, wenn wir den angegebenen Befehlen Leerzeichen hinzufügen.
71GA
13

Sie können die Daten in eine Datei einfügen und wie folgt umleiten:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Daten für das Skript:

$ cat data.txt
2
3

Ausführen des Skripts:

$ file.sh < data.txt
2
3
Guru
quelle
7

Ich möchte nur noch einen Weg hinzufügen. Fand es woanders und ist ganz einfach. Angenommen, ich möchte für alle Eingabeaufforderungen in der Befehlszeile einen Befehl "execute_command" mit "Ja" übergeben. Dann würde ich einfach "Ja" an diesen Befehl weiterleiten.

yes | execute_command

Dies verwendet Ja als Antwort auf alle Ja / Nein-Eingabeaufforderungen.


quelle
1

Sie können auch printf verwenden, um die Eingabe in Ihr Skript weiterzuleiten.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh
Spanchan
quelle
0

eine andere Alternative kann sein

echo "something" | tee /path/to/file

Der Befehl tee druckt die empfangenen Eingaben auf dem Bildschirm aus und speichert sie gleichzeitig in einer Datei.

Prafulla Kumar Sahu
quelle