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


97

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

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


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


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для получения дополнительной информации.


особенно полезно, если необходимо отправить несколько нажатий клавиш ввода
Энди

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

Также не забудьте ввести my_command arg, если у вас есть аргумент.
einarc 08

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.