Symulowanie naciśnięcia klawisza ENTER w skrypcie bash

97

Stworzyłem naprawdę prosty skrypt bash, który uruchamia kilka poleceń. jedno z tych poleceń wymaga wprowadzenia danych przez użytkownika w czasie wykonywania. tzn. pyta użytkownika „czy chcesz bla bla bla?”, chcę po prostu wysłać do niego klawisz enter, aby skrypt został całkowicie zautomatyzowany.

Nie będę musiał czekać na dane wejściowe ani nic w trakcie działania, wystarczy, że wyślę naciśnięcie klawisza, a bufor wejściowy zajmie się resztą.

tobbr
źródło
1
Jeśli narzędziem, które próbujesz zautomatyzować, jest apt-get, właściwym rozwiązaniem jest wprowadzenie w bazie danych debconf preferowanych wartości; to cię nie zapyta.
tripleee
Możesz użyć printf zamiast echo: printf "hello \ n"
hassanzadeh.sd

Odpowiedzi:

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

lub korzystając z niejawnej nowej linii generowanej przez echo (dzięki Marcin)

echo | <yourfinecommandhere>

Teraz możemy po prostu skorzystać z --skopcji:

--sk, --skip-keypressNie czekaj na naciśnięcie klawisza po każdym teście

to znaczy sudo rkhunter --sk --checkall

Tilman Vogel
źródło
1
jeśli dostarczysz to wyjście xxd, otrzymasz 5c6ehex, który jest literałem \n. jeśli to zrobisz echo | xxd , w rzeczywistości otrzymasz heks 0a. Więc myślę, że użyj tego, czego potrzebuje twój program.
Marcin
3
@Marcin, jestem zdziwiony, dostaję, 0a0aco nadal nie jest zgodne z zamierzeniem, dodając -nukrytą nową linię. Ale masz oczywiście rację, zwykły echo | ...tutaj działa dobrze. Zaktualizuję moją odpowiedź.
Tilman Vogel
Heh, nie wyglądało to dla mnie całkiem dobrze, więc musiałem go karmić przez xxd. Jest to zdecydowanie najprostsza, ale skuteczna metoda sprawdzania dokładnie, jakie polecenia wyświetlają. Uwielbiam głupie sztuczki Unixowe.
Marcin
@Marcin, nadal, dlaczego otrzymujesz 5c6e? Czy pominąłeś, -eczy twoja powłoka czy echonie traktuje tej opcji?
Tilman Vogel
otrzymuję: echo -ne "\n" | xxd 0000000: 0a i echo -n "\n" | xxd 0000000: 5c6e i echo "\n" | xxd 0000000: 5c6e 0a nie widziałem żadnej różnicy między pojedynczymi i podwójnymi cudzysłowami. Moja powłoka to zwykłe bash, czy są ustawienia, które regulowałyby zachowanie tak podstawowej funkcjonalności?
Marcin
43

yesPolecenie może okazać się przydatne.

Widzieć man yes

pavium
źródło
56
yesUważam, że to przydatne.
Pureferret,
2
To symuluje wielokrotne naciskanie klawisza „y” zamiast klawisza Enter. Chociaż prawdopodobnie chcesz zadawać pytania tak / nie, nie zadziała to w przypadku niczego, co nie wymaga „y”.
Burhan Ali
5
@BurhanAli: możesz zmienić to, co yeswysyła jako wyjście. Przeczytaj stronę podręcznika.
siride
1
czy mogę wysłać tak wiele razy dla skryptu, który oczekuje wartości domyślnych [wartość] {enter}
AK_
Działa to tylko w przypadku rzeczy takich jak mniam. Gdzie oczekuje się tego ciągu.
einarc
37

Możesz po prostu użyć tak .

# yes "" | someCommand
David Hamner
źródło
22

Oto przykładowe użycie expect:

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

Sprawdź: man expectdalsze informacje.

kenorb
źródło
szczególnie przydatne, jeśli trzeba wysłać wiele naciśnięć klawiszy
Andy
Jest to najlepszy sposób, szczególnie w przypadku rzeczy takich jak phars, w których wysyłane są różne ciągi stdout i stdin.
einarc
Pamiętaj też, aby po prostu wpisać argument my_command, jeśli masz argument.
einarc