Имитация нажатия клавиши ENTER в сценарии bash

97

Я создал действительно простой сценарий bash, который запускает несколько команд. одна из этих команд требует ввода данных пользователем во время выполнения. т.е. он спрашивает пользователя «вы хотите бла-бла-бла?», я хочу просто послать на это нажатие клавиши ввода, чтобы сценарий был полностью автоматизирован.

Мне не придется ждать ввода или чего-то еще во время выполнения, достаточно просто отправить нажатие клавиши, а буфер ввода обработает все остальное.

Tobbr
источник
1
Если инструмент, который вы пытаетесь автоматизировать apt-get, таков , правильным решением будет предварительно заполнить базу данных debconf вашими предпочтительными значениями; тогда он вас не спросит.
Tripleee
Вы можете использовать printf вместо echo: printf "hello \ n"
hassanzadeh.sd

Ответы:

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

или воспользоваться неявной новой строкой, которую генерирует echo (спасибо Марчину)

echo | <yourfinecommandhere>

Теперь мы можем просто использовать --skопцию:

--sk, --skip-keypressНе ждите нажатия клавиши после каждого теста

т.е. sudo rkhunter --sk --checkall

Тильман Фогель
источник
1
если вы передадите этот вывод, xxdвы получите 5c6eшестнадцатеричный код, который является буквальным \n. если вы это сделаете, echo | xxd вы фактически получите шестигранник 0a. Так что я думаю использовать то, что нужно вашей программе.
Marcin
3
@Marcin, я удивлен, я получаю то, 0a0aчто все еще не так, как предполагалось, добавляя -nнеявный перевод строки. Но вы, конечно же, правы, echo | ...здесь отлично работает равнина . Обновлю свой ответ.
Tilman Vogel
Хех, мне это показалось не совсем правильным, поэтому пришлось кормить его через xxd. Это, безусловно, самый простой, но эффективный способ узнать, какие именно команды выводят. Обожаю глупые уловки Unix.
Marcin
@Marcin, все же, почему ты попал 5c6e? Вы пропустили -e, ваша оболочка или echoне рассматривает этот вариант?
Tilman Vogel
я получаю: echo -ne "\n" | xxd 0000000: 0a и , echo -n "\n" | xxd 0000000: 5c6e и echo "\n" | xxd 0000000: 5c6e 0a я не видел никакой разницы между одинарными и двойными кавычками. Моя оболочка - это обычный bash, есть ли настройки, которые регулируют поведение таких основных функций?
Marcin
43

Вы можете найти эту yesкоманду полезной.

Видеть man yes

павиум
источник
56
yesЯ считаю это полезным.
Pureferret 05
2
Это имитирует нажатие клавиши «y» несколько раз, а не клавиши Enter. Хотя это, вероятно, то, что вы хотите ответить на вопросы типа «да / нет», это не сработает для всего, что не предполагает «у».
Бурхан Али
5
@BurhanAli: вы можете изменить то, что yesотправляет на выходе. Прочтите страницу руководства.
siride
1
Могу ли я отправить «Да» несколько раз для сценария, который ожидает значения по умолчанию [значение] {ввод}
AK_
Это работает только для таких вещей, как yum. Где ожидается эта строка.
einarc 08
37

Вы можете просто использовать " да" .

# yes "" | someCommand
Дэвид Хамнер
источник
22

Вот пример использования expect:

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

Проверьте: man expectдля получения дополнительной информации.

Kenorb
источник
особенно полезно, если необходимо отправить несколько нажатий клавиш ввода
Энди
Это лучший способ, особенно для таких вещей, как phars, где отправляются разные строки stdout и stdin.
einarc 08
Также не забудьте ввести my_command arg, если у вас есть аргумент.
einarc 08
11

Вы можете использовать expectman expect есть примеры).

barti_ddu
источник