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


114

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

Це не один варіант, який мені доведеться передати інтерактивному сценарію.


2
Якщо він читає з stdin, ви можете ввести свій вхід
lc.

4
Оскільки це питання отримує багато дублікатів, варто зазначити, що не має значення, на якій мові написана інтерактивна програма. Це може бути програма C, яка читає стандартний ввід, або програма Erlang, або будь-що інше. Щось працює з командного рядка і неприємно вимагає інтерактивного введення, і ви хочете його автоматизувати.
трійка

Звичайно, якщо у вас є контроль над шкідливим додатком, перепишіть його, щоб він міг читати відповіді неінтерактивно (через файл конфігурації, параметри командного рядка чи інше). Це набагато надійніше і надійніше проти зміни порядку чи формулювання інтерактивних питань.
тріплей

Відповіді:


46

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

Це також працює у таких випадках, sshколи забороняється розсилати паролі до нього.


8
... Хоча правильним рішенням у випадку SSH є перехід на аутентифікацію з відкритим ключем.
трійка

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 Відповідно до сказаного, як скрипт читає паролі, на які stdin не впливає? Я знаю, що ви можете використовувати, readщоб схопити stdin, яку функцію ви можете використовувати, як описано?
flow2k

У такому випадку вам потрібно перевірити, чи програма, з якою ви намагаєтесь взаємодіяти, має спеціальний спосіб надіслати вхід на неї (наприклад, sshpass, ssh-агент), або використовувати очікувати для скрипту взаємодії.
Гленн Джекман

2
Такі програми, як Expect do, запускають клієнта під псевдо-tty, де він виглядає на клієнті, як на другому кінці є користувач з терміналом і клавіатурою. Ви не можете зробити це звичайною трубою.
tripleee

Важливе повідомлення. Це не працює, якщо ми додамо пробіли до поданих команд.
71ГА

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

Це використовуватиме так як відповідь на всі підказки "так / ні".


1

Ви також можете використовувати printf для передачі вхідного сценарію.

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

0

інше ралітернативне може бути

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

Команда tee віддрукує отриманий вхід на екран і одночасно зберігає його у файлі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.