จำลองการกดแป้น ENTER ในสคริปต์ทุบตี


100

ฉันได้สร้างสคริปต์ทุบตีที่เรียบง่ายซึ่งรันคำสั่งไม่กี่คำสั่ง หนึ่งในคำสั่งเหล่านี้ต้องการอินพุตของผู้ใช้ระหว่างรันไทม์ กล่าวคือถามผู้ใช้ว่า "do you want to blah blah blah?" ฉันต้องการเพียงแค่ส่งปุ่ม Enter ไปที่สิ่งนี้เพื่อให้สคริปต์เป็นไปโดยอัตโนมัติ

ฉันไม่ต้องรออินพุตหรืออะไรเลยในระหว่างรันไทม์มันเพียงพอที่จะส่งการกดแป้นและบัฟเฟอร์อินพุตจะจัดการส่วนที่เหลือ


1
หากเครื่องมือที่คุณพยายามทำให้เป็นอัตโนมัติapt-getวิธีแก้ไขที่เหมาะสมคือตั้งค่าฐานข้อมูล debconf ไว้ล่วงหน้าด้วยค่าที่คุณต้องการ แล้วมันจะไม่ถามคุณ
tripleee

คุณสามารถใช้ printf แทน echo: printf "hello \ n"
hassanzadeh.sd

คำตอบ:


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

หรือใช้ประโยชน์จากบรรทัดใหม่โดยปริยายที่สร้างเสียงสะท้อน (ขอบคุณ Marcin)

echo | <yourfinecommandhere>

ตอนนี้เราสามารถใช้--skตัวเลือก:

--sk, --skip-keypressไม่ต้องรอให้กดแป้นหลังจากแต่ละการทดสอบ

กล่าวคือ sudo rkhunter --sk --checkall


1
หากคุณป้อนเอาต์พุตนี้ให้xxdคุณได้5c6eฐานสิบหกซึ่งเป็นลิเทอรั\nล ถ้าคุณทำเพียงแค่echo | xxd คุณจบลงด้วยเลขฐานสิบหกของ0a. ดังนั้นฉันเดาว่าใช้ตามที่โปรแกรมของคุณต้องการ
Marcin

3
@Marcin ผมประหลาดใจที่ฉันได้รับ0a0aซึ่งยังคงไม่ได้ตั้งใจเพิ่ม-nsuppreses ขึ้นบรรทัดใหม่โดยปริยาย แต่ของคุณถูกต้องecho | ...ผลงานธรรมดา ๆที่นี่ จะอัปเดตคำตอบของฉัน
Tilman Vogel

เฮ้มันดูไม่เหมาะกับฉันเลยฉันต้องเลี้ยงมันผ่าน xxd เป็นวิธีที่ง่ายที่สุด แต่มีประสิทธิภาพในการดูว่าคำสั่งใดส่งออก ต้องรักเทคนิค Unix โง่ ๆ
Marcin

@ มาร์ซินนิ่งทำไมรับ5c6e? คุณละเว้น-eหรือไม่ใช้เปลือกของคุณหรือechoไม่ปฏิบัติตามตัวเลือกนั้น?
Tilman Vogel

ฉันจะได้รับ: echo -ne "\n" | xxd 0000000: 0a และecho -n "\n" | xxd 0000000: 5c6e และ echo "\n" | xxd 0000000: 5c6e 0a ฉันไม่ได้เห็นความแตกต่างระหว่างคำพูดเดี่ยวและคู่ใด ๆ เปลือกของฉันเป็นเพียงการทุบตีธรรมดามีการตั้งค่าที่จะควบคุมพฤติกรรมของฟังก์ชันพื้นฐานดังกล่าวหรือไม่?
Marcin

43

คุณอาจพบว่าyesคำสั่งมีประโยชน์

ดู man yes


57
yesฉันคิดว่ามันมีประโยชน์
Pureferret

2
ซึ่งจะจำลองการกด "y" ซ้ำ ๆ แทนที่จะกดปุ่ม Enter แม้ว่านี่อาจเป็นสิ่งที่คุณต้องการสำหรับคำถามใช่ / ไม่ใช่ แต่ก็ใช้ไม่ได้กับสิ่งที่ไม่คาดหวัง "y"
Burhan Ali

5
@BurhanAli: คุณสามารถเปลี่ยนสิ่งที่yesส่งเป็นผลลัพธ์ได้ อ่านหน้าคน
siride

1
ฉันสามารถส่งหลายครั้งได้ไหมสำหรับสคริปต์ที่คาดว่าจะเป็นค่าเริ่มต้น [ค่า] {enter}
AK_

สิ่งนี้ใช้ได้กับสิ่งต่างๆเช่นยำเท่านั้น ที่คาดว่าสตริงนั้น
einarc


23

นี่คือตัวอย่างการใช้งานโดยใช้expect:

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

ตรวจสอบ: man expectสำหรับข้อมูลเพิ่มเติม


มีประโยชน์อย่างยิ่งหากจำเป็นต้องส่งการกดแป้น Enter หลายครั้ง
Andy

นี่เป็นวิธีที่ดีที่สุดโดยเฉพาะสำหรับสิ่งต่างๆเช่น phars ที่มีการส่งสตริง stdout และ stdin ที่แตกต่างกัน
einarc

อย่าลืมป้อน my_command arg หากคุณมีอาร์กิวเมนต์
einarc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.