Передача аргументов в интерактивную программу в неинтерактивном режиме

115

У меня есть сценарий bash, который использует readкоманду для интерактивного чтения аргументов команд, например параметров да / нет. Есть ли способ вызвать этот сценарий в неинтерактивном сценарии, передавая значения параметров по умолчанию в качестве аргументов?

Это не просто один из вариантов, который я должен передать интерактивному сценарию.

Сидхарт Шарма
источник
2
Если он читает из стандартного ввода, вы можете ввести свой ввод
lc.
4
Поскольку у этого вопроса много дубликатов, стоит отметить, что не имеет значения, на каком языке написана интерактивная программа. Это может быть программа C, которая читает стандартный ввод, или приложение Erlang, или что-то еще. Есть что-то, что запускается из командной строки и требует интерактивного ввода, и вы хотели бы это автоматизировать.
tripleee
Конечно, если у вас есть контроль над неприятным приложением, перепишите его, чтобы оно могло читать ответы без взаимодействия (через файл конфигурации, параметры командной строки или что-то еще). Это гораздо более надежно и устойчиво против изменения порядка или формулировки интерактивных вопросов.
Tripleee

Ответы:

46

Для более сложных задач есть expect( http://en.wikipedia.org/wiki/Expect ). Он в основном имитирует пользователя, вы можете написать сценарий, как реагировать на определенные выходные данные программы и связанные с ними вещи.

Это также работает в таких случаях, sshкогда к нему запрещены пароли по конвейеру.

Дани Гехтдичниксан
источник
8
... Хотя правильным решением в случае SSH является переход на аутентификацию с открытым ключом.
tripleee
154

Много способов

направьте свой ввод

echo "yes
no
maybe" | your_program

перенаправить из файла

your_program < answers.txt

используйте здесь документ (он может быть очень читаемым)

your_program << ANSWERS
yes
no
maybe
ANSWERS

используйте здесь строку

your_program <<< $'yes\nno\nmaybe\n'
Гленн Джекман
источник
5
Следует отметить, что это работает, только если программа читает стандартный ввод. Некоторые программы стараются изо всех сил читать, например, пароли в интерактивном режиме, даже если стандартный ввод представляет собой канал. Для паролей это имеет смысл из соображений безопасности; хотя некоторые интерактивные программы просто плохо спроектированы.
tripleee
@tripleee В соответствии с тем, что вы сказали, как сценарий считывает пароли, на которые не влияет stdin? Я знаю, что вы можете использовать readstdin, какую функцию вы можете использовать для того, что вы описали?
flow2k
В этом случае вам нужно увидеть, есть ли у программы, с которой вы пытаетесь взаимодействовать, особый способ отправки ей входных данных (например, sshpass, ssh-agent) или использовать expect для сценария взаимодействия.
Гленн Джекман
2
Такие программы, как Expect, запускают клиента под псевдотерминалом, где он выглядит для клиента так, как будто на другом конце находится пользователь с терминалом и клавиатурой. С обычной трубкой этого не сделать.
Tripleee
Важное замечание. Это не сработает, если мы добавим пробелы к предоставленным командам.
71GA
13

Вы можете поместить данные в файл и перенаправить его следующим образом:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Данные для скрипта:

$ cat data.txt
2
3

Выполнение скрипта:

$ file.sh < data.txt
2
3
Гуру
источник
7

Просто хочу добавить еще один способ. Нашел его в другом месте, и это довольно просто. Скажем, я хочу передать «да» для всех запросов в командной строке для команды «execute_command», тогда я просто пропущу к нему «да».

yes | execute_command

Это будет использовать «да» в качестве ответа на все запросы «да / нет».


источник
2

Вы также можете использовать printf для передачи ввода в ваш скрипт.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh
спанчан
источник
Вот что меня спасло. Спасибо @spanchan.
sk001
0

другой альтернативой может быть

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

Команда tee выводит полученный ввод на экран и одновременно сохраняет его в файл.

Прафулла Кумар Саху
источник