Simulando o pressionamento de tecla ENTER no script bash

97

Criei um script bash realmente simples que executa alguns comandos. um desses comandos precisa da entrada do usuário durante o tempo de execução. ou seja, ele pergunta ao usuário "você quer blá, blá, blá?", eu quero simplesmente enviar um pressionamento de tecla Enter para que o script seja totalmente automatizado.

Eu não terei que esperar pela entrada ou qualquer coisa durante o tempo de execução, é o suficiente apenas enviar o pressionamento de tecla e o buffer de entrada cuidará do resto.

Tobbr
fonte
1
Se a ferramenta que você está tentando automatizar é apt-get, a solução apropriada é pré-configurar o banco de dados debconf com seus valores preferidos; então não vai perguntar a você.
tripleee
Você pode usar printf em vez de echo: printf "hello \ n"
hassanzadeh.sd

Respostas:

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

ou aproveitando a nova linha implícita que echo gera (obrigado Marcin)

echo | <yourfinecommandhere>

Agora podemos simplesmente usar a --skopção:

--sk, --skip-keypressNão espere por um pressionamento de tecla após cada teste

ie sudo rkhunter --sk --checkall

Tilman Vogel
fonte
1
se você alimentar essa saída para xxdobter 5c6ehex, que é um literal \n. se você fizer echo | xxd isso, acabará com um feitiço de 0a. Então eu acho que use o que seu programa precisar.
Marcin
3
@Marcin, estou surpreso, entendi 0a0aque ainda não é o pretendido, adicionando um -nsuprime a nova linha implícita. Mas você está certo, claro, um plano echo | ...funciona bem aqui. Atualizará minha resposta.
Tilman Vogel
Heh, não parecia muito certo para mim, então tive que alimentá-lo por meio de xxd. É de longe o método mais simples, porém eficiente, de ver exatamente o que os comandos geram. Tenho que amar truques estúpidos do Unix.
Marcin
@Marcin, ainda, por que você entende 5c6e? Você omitiu -eou faz seu shell ou echonão tratou essa opção?
Tilman Vogel
eu recebo: echo -ne "\n" | xxd 0000000: 0a e echo -n "\n" | xxd 0000000: 5c6e e echo "\n" | xxd 0000000: 5c6e 0a eu não vi nenhuma diferença entre aspas simples e duplas. Meu shell é apenas um bash normal, há configurações que regulam o comportamento de tal funcionalidade básica?
Marcin
43

Você pode achar o yescomando útil.

Vejo man yes

pavium
fonte
54
yesEu acho isso útil.
Pureferret
2
Isso simula o pressionamento de "y" repetidamente em vez da tecla Enter. Embora isso seja provavelmente o que você deseja para perguntas sim / não, não funcionará para nada que não espere um "y".
Burhan Ali
5
@BurhanAli: você pode alterar o que yesenvia como saída. Leia a página do manual.
siride de
1
posso enviar sim várias vezes para um script que espera valores padrão [valor] {enter}
AK_
Isso só funciona para coisas como yum. Onde essa string é esperada.
einarc de
35

Você pode apenas usar sim .

# yes "" | someCommand
David Hamner
fonte
22

Aqui está um exemplo de uso expect:

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

Verifique: man expectpara mais informações.

Kenorb
fonte
especialmente útil se vários pressionamentos de tecla Enter precisam ser enviados
Andy
Esta é a melhor maneira, especialmente para coisas como phars, onde diferentes strings stdout e stdin são enviadas.
einarc de
Lembre-se também de inserir apenas o arg my_command se tiver um argumento.
einarc de
11

Você pode fazer uso de expect ( man expect vem com exemplos).

barti_ddu
fonte