Імітація натискання клавіші ENTER у сценарії bash


97

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

Мені не доведеться чекати введення чи чогось іншого під час виконання, його достатньо, щоб просто надіслати натискання клавіші, а вхідний буфер впорається з рештою.


1
Якщо інструментом, який ви намагаєтеся автоматизувати, є apt-getправильне рішення - попередньо заповнити базу даних debconf бажаними значеннями; тоді воно вас не запитає.
триплі

Ви можете використовувати printf замість луни: printf "привіт \ n"
hassanzadeh.sd

Відповіді:


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

або скористатися імпліцитним новим рядком, який генерує ехо (спасибі Marcin)

echo | <yourfinecommandhere>

Тепер ми можемо просто скористатися --skопцією:

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

тобто sudo rkhunter --sk --checkall


1
якщо ви подасте цей результат, xxdви отримаєте 5c6eшістнадцяткову форму, що є буквалом \n. якщо ви робите просто echo | xxd ви насправді в кінцевому підсумку з hex 0a. Тому я думаю, використовуйте те, що потрібно вашій програмі.
Marcin

3
@Marcin, я здивований, я отримую те, 0a0aщо все ще не так, як передбачалося, додавши -nвиразний імпліцитний новий рядок. Але ви, звичайно, праві, рівнина echo | ...тут чудово працює. Оновить мою відповідь.
Тілман Фогель

Хе, мені це здавалося не зовсім правильно, тому я мусив годувати це через xxd. На сьогоднішній день це найпростіший, але ефективний спосіб побачити, які саме команди виводяться. Потрібно любити дурні трюки Unix.
Marcin

@Marcin, все-таки, чому ти отримуєш 5c6e? Ви пропустили -eабо ваша оболонка чи echoне обробляла такий варіант?
Тілман Фогель

я отримую: echo -ne "\n" | xxd 0000000: 0a і , echo -n "\n" | xxd 0000000: 5c6e і echo "\n" | xxd 0000000: 5c6e 0a я не бачив ніякої різниці між одинарними і подвійними лапками. Моя оболонка - це звичайний bash, чи є параметри, які регулюють поведінку такої базової функціональності?
Marcin

43

Можливо, ця yesкоманда виявиться корисною.

Побачити man yes


54
yesЯ вважаю це корисним.
Pureferret

2
Це імітує повторне натискання "y", а не клавішу Enter. Хоча це, мабуть, саме те, що ви хочете запитати так / ні, воно не спрацює ні для чого, що не очікує «у».
Бурхан Алі

5
@BurhanAli: ви можете змінити те, що yesнадсилає як результат. Прочитайте сторінку керівництва.
siride

1
Чи можу я надіслати стільки разів для сценарію, який очікує значень за замовчуванням [значення] {enter}
AK_

Це працює лише для таких речей, як ням. Де цей рядок очікується.
einarc


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

Також не забудьте просто ввести аргумент my_command, якщо у вас є аргумент.
einarc

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