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.


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


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


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.