Mensimulasikan penekanan tombol ENTER dalam skrip bash

97

Saya telah membuat skrip bash yang sangat sederhana yang menjalankan beberapa perintah. salah satu dari perintah ini membutuhkan masukan pengguna selama runtime. yaitu menanyakan pengguna "apakah Anda ingin bla bla bla?", Saya hanya ingin mengirim tombol enter ke tombol ini sehingga skrip akan sepenuhnya otomatis.

Saya tidak perlu menunggu input atau apa pun selama runtime, itu cukup hanya mengirim penekanan tombol dan buffer input akan menangani sisanya.

tobbr
sumber
1
Jika alat yang Anda coba otomatisasi adalah apt-get, solusi yang tepat adalah preseed database debconf dengan nilai pilihan Anda; maka itu tidak akan meminta Anda.
tripleee pada
Anda dapat menggunakan printf daripada echo: printf "hello \ n"
hassanzadeh.sd

Jawaban:

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

atau memanfaatkan baris baru implisit yang dihasilkan gema (terima kasih Marcin)

echo | <yourfinecommandhere>

Sekarang kita cukup menggunakan --skopsi:

--sk, --skip-keypressJangan menunggu tombol ditekan setelah setiap pengujian

yaitu sudo rkhunter --sk --checkall

Tilman Vogel
sumber
1
jika Anda memberi makan keluaran ini untuk xxdAnda mendapatkan 5c6ehex, yang merupakan literal \n. jika Anda melakukannya, echo | xxd Anda akan mendapatkan hex 0a. Jadi saya kira gunakan mana saja yang dibutuhkan program Anda.
Marcin
3
@Marcin, saya terkejut, saya mendapatkan 0a0ayang masih tidak sesuai keinginan, menambahkan sebuah -nsuppreses baris baru implisit. Tapi Anda tentu saja benar, sebuah dataran echo | ...berfungsi dengan baik di sini. Akan memperbarui jawaban saya.
Tilman Vogel
Heh, itu tidak terlihat benar bagi saya, jadi saya harus memberinya makan melalui xxd. Sejauh ini, ini adalah metode paling sederhana namun efisien untuk melihat dengan tepat keluaran perintah apa. Harus menyukai trik Unix yang bodoh.
Marcin
@Marcin, masih, kenapa kamu mendapatkan 5c6e? Apakah Anda menghilangkan -eatau apakah shell Anda atau echotidak memperlakukan opsi itu?
Tilman Vogel
i get: echo -ne "\n" | xxd 0000000: 0a dan echo -n "\n" | xxd 0000000: 5c6e dan echo "\n" | xxd 0000000: 5c6e 0a saya belum melihat perbedaan apa pun antara tanda kutip tunggal dan ganda. Shell saya hanyalah bash biasa, apakah ada pengaturan yang akan mengatur perilaku fungsionalitas dasar seperti itu?
Marcin
43

Anda mungkin menemukan yesperintah itu berguna.

Lihat man yes

pavium
sumber
56
yesSaya merasa itu berguna.
Pureferret
2
Ini mensimulasikan menekan "y" berulang kali daripada tombol Enter. Meskipun ini mungkin pertanyaan yang ingin Anda jawab dengan ya / tidak, ini tidak akan berhasil untuk apa pun yang tidak mengharapkan "y".
Burhan Ali
5
@ BurhanAli: Anda dapat mengubah apa yang yesdikirim sebagai outputnya. Baca halaman manual.
siride
1
dapatkah saya mengirim ya berkali-kali untuk skrip yang mengharapkan nilai default [nilai] {enter}
AK_
Ini hanya berfungsi untuk hal-hal seperti yum. Dimana string itu diharapkan.
einarc
37

Anda bisa menggunakan ya .

# yes "" | someCommand
David Hamner
sumber
22

Berikut adalah contoh penggunaan menggunakan expect:

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

Periksa: man expectuntuk informasi lebih lanjut.

kenorb
sumber
sangat membantu jika beberapa penekanan tombol masuk perlu dikirim
Andy
Ini adalah cara terbaik, khususnya untuk hal-hal seperti phars di mana string stdout dan stdin yang berbeda dikirim.
einarc
Juga ingat untuk memasukkan my_command arg jika Anda memiliki argumen.
einarc
11

Anda bisa memanfaatkan ekspektasi ( ekspektasi manusia disertai dengan contoh).

barti_ddu
sumber