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.


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.


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'

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

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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.