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ą.


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


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


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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.