Simular la pulsación de la tecla ENTER en un script bash

97

He creado un script bash realmente simple que ejecuta algunos comandos. uno de estos comandos necesita la entrada del usuario durante el tiempo de ejecución. es decir, le pregunta al usuario "¿quieres bla, bla, bla?", simplemente quiero enviar una pulsación de tecla enter para que el script esté completamente automatizado.

No tendré que esperar la entrada ni nada durante el tiempo de ejecución, es suficiente con enviar la pulsación de tecla y el búfer de entrada se encargará del resto.

tobbr
fuente
1
Si la herramienta que está intentando automatizar es apt-get, la solución adecuada es preconfigurar la base de datos debconf con sus valores preferidos; entonces no te preguntará.
tripleee
Puede usar printf en lugar de echo: printf "hola \ n"
hassanzadeh.sd

Respuestas:

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

o aprovechando la nueva línea implícita que genera el eco (gracias Marcin)

echo | <yourfinecommandhere>

Ahora podemos simplemente usar la --skopción:

--sk, --skip-keypressNo espere a que se presione una tecla después de cada prueba

es decir sudo rkhunter --sk --checkall

Tilman Vogel
fuente
1
si alimenta esta salida xxd, obtiene 5c6ehexadecimal, que es un literal \n. si lo haces echo | xxd , en realidad terminas con un hechizo de 0a. Así que supongo que utilice el programa que necesite.
Marcin
3
@Marcin, me sorprende, obtengo lo 0a0aque todavía no es el previsto, agregando un -nsuprime la nueva línea implícita. Pero, por supuesto, tienes razón, un simple echo | ...funciona bien aquí. Actualizaré mi respuesta.
Tilman Vogel
Je, no me pareció del todo correcto, así que tuve que pasarlo por xxd. Es, con mucho, el método más simple pero eficiente para ver exactamente qué comandos generan. Me encantan los trucos estúpidos de Unix.
Marcin
@Marcin, aún así, ¿por qué te pones 5c6e? ¿Omitió -eo su caparazón o echono trató esa opción?
Tilman Vogel
me sale: echo -ne "\n" | xxd 0000000: 0a y echo -n "\n" | xxd 0000000: 5c6e y echo "\n" | xxd 0000000: 5c6e 0a no he visto ninguna diferencia entre comillas simples y dobles. Mi shell es solo un bash normal, ¿hay configuraciones que regulen el comportamiento de una funcionalidad tan básica?
Marcin
43

Puede que el yescomando le resulte útil.

Ver man yes

pavium
fuente
54
yesLo encuentro útil.
Pureferret
2
Esto simula presionar "y" repetidamente en lugar de la tecla Enter. Si bien esto es probablemente lo que desea para las preguntas de sí / no, no funcionará para nada que no espere una "y".
Burhan Ali
5
@BurhanAli: puede cambiar lo que yesenvía como salida. Lea la página del manual.
siride
1
¿Puedo enviar sí varias veces para un script que espera valores predeterminados [valor] {enter}
AK_
Esto solo funciona para cosas como yum. Donde se espera esa cadena.
einarc
35

Puedes usar yes .

# yes "" | someCommand
David Hamner
fuente
22

Aquí está el uso de muestra usando expect:

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

Consultar: man expectpara más información.

Kenorb
fuente
especialmente útil si es necesario enviar varias pulsaciones de teclas de entrada
Andy
Esta es la mejor manera, especialmente para cosas como phars donde se envían diferentes cadenas stdout y stdin.
einarc
También recuerde ingresar my_command arg si tiene un argumento.
einarc
11

Puede hacer uso de esperar (el hombre espera viene con ejemplos).

barti_ddu
fuente