คาดว่าจะหมดเวลาในการเขียนสคริปต์ Bash


13

ฉันจะเพิ่มการหมดเวลาสำหรับ "คาดหวัง" ในสคริปต์ต่อไปนี้ได้อย่างไร ฉันต้องการตั้งค่าเป็น 120 วินาที

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"

คำตอบ:


13

การหมดเวลาเริ่มต้นของexpect10 วินาทีตาม manpage หากต้องการเปลี่ยนเป็น 120 วินาทีก่อนspawn ssh $USER@$HOSTเพิ่มบรรทัด

set timeout 120

เพื่อทำสิ่งนี้

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

2

ตามที่ดึงออกมาจาก man page สำหรับความคาดหวัง:

"คาดหวัง [[-opts] pat1 body1] ... ... [-opts] patn [bodyn]

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

รูปแบบจากคำสั่ง expect_before ล่าสุดถูกใช้โดยนัยก่อนรูปแบบอื่นใด รูปแบบจากคำสั่ง expect_after ล่าสุดถูกใช้โดยนัยหลังจากรูปแบบอื่น ๆ

หากอาร์กิวเมนต์ของข้อความคาดหวังทั้งหมดต้องการมากกว่าหนึ่งบรรทัดอาร์กิวเมนต์ทั้งหมดอาจเป็น "ค้ำยัน" เป็นหนึ่งเพื่อหลีกเลี่ยงการยกเลิกแต่ละบรรทัดด้วยแบ็กสแลช ในกรณีนี้การทดแทน Tcl ปกติจะเกิดขึ้นแม้จะมีเครื่องหมายวงเล็บ

หากรูปแบบคือคำหลัก eof ร่างกายที่สอดคล้องกันจะถูกดำเนินการเมื่อสิ้นสุดไฟล์ หากรูปแบบคือการหมดเวลาของคำหลักเนื้อหาที่เกี่ยวข้องจะถูกดำเนินการเมื่อหมดเวลา หากไม่มีการใช้คำหลักสำหรับการหมดเวลาระบบจะใช้คำสั่ง null แบบปริยายเมื่อหมดเวลา รอบระยะเวลาการหมดเวลาเริ่มต้นคือ 10 วินาที แต่อาจถูกตั้งค่าตัวอย่างเช่น 30 โดยคำสั่ง "set timeout 30" การหมดเวลาไม่สิ้นสุดอาจถูกกำหนดโดยค่า -1 หากรูปแบบเป็นค่าเริ่มต้นของคำสำคัญเนื้อหาที่เกี่ยวข้องจะถูกดำเนินการตามระยะหมดเวลาหรือสิ้นสุดไฟล์

หากรูปแบบตรงกันแล้วร่างกายที่สอดคล้องกันจะถูกดำเนินการ คาดหวังผลตอบแทนของร่างกาย (หรือสตริงที่ว่างเปล่าหากไม่มีรูปแบบที่ตรงกัน) ในกรณีที่มีหลายรูปแบบที่ตรงกันรูปแบบที่ปรากฏก่อนจะถูกใช้เพื่อเลือกเนื้อหา ... "


1

@DerfK ได้ตอบคำถามของคุณแล้ว ฉันต้องการปรับโครงสร้างสคริปต์ของคุณเพื่อการบำรุงรักษา:

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

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