Simulazione della pressione del tasto INVIO nello script bash


97

Ho creato uno script bash davvero semplice che esegue alcuni comandi. uno di questi comandi richiede l'input dell'utente durante il runtime. cioè chiede all'utente "vuoi blah blah blah?", voglio semplicemente inviare un tasto Invio a questo in modo che lo script sia completamente automatizzato.

Non dovrò aspettare l'input o altro durante il runtime, è sufficiente inviare semplicemente la pressione dei tasti e il buffer di input gestirà il resto.


1
Se lo strumento che stai tentando di automatizzare è apt-get, la soluzione corretta è preconfigurare il database debconf con i tuoi valori preferiti; allora non te lo chiederà.
tripleee

Potresti usare printf invece di echo: printf "ciao \ n"
hassanzadeh.sd

Risposte:


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

o sfruttando la nuova riga implicita che l'eco genera (grazie Marcin)

echo | <yourfinecommandhere>

Ora possiamo semplicemente usare l' --skopzione:

--sk, --skip-keypressNon aspettare la pressione di un tasto dopo ogni test

cioè sudo rkhunter --sk --checkall


1
se fornisci questo output xxdottieni 5c6ehex, che è letterale \n. se lo fai echo | xxd , in realtà finisci con un esagono di 0a. Quindi immagino che usi quello che il tuo programma ha bisogno.
Marcin

3
@ Marcin, sono sorpreso, ho capito 0a0ache non è ancora come previsto, l'aggiunta di un -nsopprime la nuova riga implicita. Ma ovviamente hai ragione, una pianura echo | ...funziona bene qui. Aggiornerò la mia risposta.
Tilman Vogel

Heh, non mi sembrava del tutto corretto, quindi ho dovuto alimentarlo tramite xxd. È di gran lunga il metodo più semplice ed efficiente per vedere esattamente quali comandi vengono emessi. Devo amare gli stupidi trucchi Unix.
Marcin

@ Marcin, ancora, perché ottieni 5c6e? Hai omesso -eo la tua shell o echonon tratta questa opzione?
Tilman Vogel

ottengo: echo -ne "\n" | xxd 0000000: 0a e echo -n "\n" | xxd 0000000: 5c6e e echo "\n" | xxd 0000000: 5c6e 0a non ho visto alcuna differenza tra virgolette singole e doppie. La mia shell è solo un normale bash, ci sono impostazioni che regolerebbero il comportamento di tali funzionalità di base?
Marcin

43

Potresti trovare yesutile il comando.

Vedere man yes


55
yesLo trovo utile.
Pureferret

2
Questo simula la pressione ripetuta di "y" anziché il tasto Invio. Anche se questo è probabilmente quello che vuoi fare domande sì / no, non funzionerà per nulla che non si aspetti una "y".
Burhan Ali

5
@ BurhanAli: puoi modificare ciò che yesinvia come output. Leggi la pagina man.
siride

1
posso inviare sì più volte per uno script che prevede valori predefiniti [valore] {
invio

Funziona solo per cose come yum. Dove è prevista quella stringa.
einarc


22

Ecco un esempio di utilizzo che utilizza expect:

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

Controllare: man expectper ulteriori informazioni.


particolarmente utile se è necessario inviare più pressioni di tasti di invio
Andy

Questo è il modo migliore, specialmente per cose come phars in cui vengono inviate diverse stringhe stdout e stdin.
einarc

Ricorda anche di inserire my_command arg se hai un argomento.
einarc

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.