สำหรับบริบท ฉันมีโครงสร้างพื้นฐานของเครื่องหลายเครื่องที่ใช้ ssh
เราเชื่อมต่อผ่าน ssh ในฐานะรูทบนเครื่องโดยไม่ต้องใช้รหัสผ่าน ขอบคุณไฟล์ที่ได้รับอนุญาตในแต่ละเครื่อง เรากำลังเพิ่มเครื่องจักรใหม่อย่างสม่ำเสมอในโครงสร้างพื้นฐานของเรา
ปัญหาคือการสร้างสคริปต์ที่:
- ปิงเครื่องทั้งหมด (โดยการแยกวิเคราะห์ผ่านไฟล์ที่มีชื่อเครื่องของเราทั้งหมด)
- หากการ ping สำเร็จ ให้ทดสอบการเชื่อมต่อ ssh โดยไม่ต้องใช้รหัสผ่าน (ด้วยคำสั่ง
ssh -o BatchMode=ใช่ $machine uname -a
)
- หาก ssh ไม่ทำงานและเป็นเพราะข้อความนี้:
คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อต่อ (ใช่/ไม่ใช่)
(เนื่องจากเป็นการเชื่อมต่อ ssh ครั้งแรกกับเครื่องนี้) จากนั้นด้วยสคริปต์คาดหวัง ให้ส่ง "ใช่"
- หาก ssh ไม่ทำงานและเป็นเพราะมีการถามรหัสผ่าน ให้ส่ง "CTRL + C" ด้วยสคริปต์ที่คาดไว้
ปัญหาของฉันคือทั้งสองเงื่อนไข 3. และ 4. สามารถเกิดขึ้นได้กับเครื่องเดียวและฉันไม่สามารถหาวิธีใช้คำสั่งดำเนินการต่อในสคริปต์ของฉันได้
กรณีนี้เฉพาะสำหรับเครื่องที่ขอ "ใช่" แต่หลังจากนั้นขอรหัสผ่านด้วย
นี่คือลักษณะของสคริปต์:
สำหรับเครื่องใน `cat ${liste} | grep -v \#`
ทำ
ping -c1 ${เครื่อง} 2>&1 >/dev/null
ถ้า [ $? -eq 0 ]
แล้ว
echo ${เครื่อง} >> ${pingok}
ssh -o BatchMode=ใช่ ${machine} uname -a &> $verifssh 2>&1
ก้อง $? > ${exitcode}
ถ้า grep -q "255" "$exitcode"
แล้ว
ตัด -c 15-74 $verifssh > $verifssh2
ถ้า grep "ication ล้มเหลว" "$verifssh2"
แล้ว
คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
ต่อ 3
elif grep "การอนุญาตถูกปฏิเสธ (กุญแจสาธารณะ, รหัสผ่าน, แป้นพิมพ์แบบโต้ตอบ)" "$verifssh2"
แล้ว
คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
echo "${machine} -> เครื่องถามรหัสผ่าน" >> "${sshnok}"
ไฟ
elif grep -q "0" "$exitcode"
แล้ว
echo "${machine} ใช้งานได้กับ ssh"
echo "${เครื่อง}" >> ${sshok}
ไฟ
อื่น
echo "${เครื่อง}" >> "${pingnok}"
ไฟ
เสร็จแล้ว
นี่คือสคริปต์คาดหวัง (จัดการทั้งสองสถานการณ์):
ตั้งเครื่อง [lindex $argv 0]
วางไข่ ssh $เครื่อง
คาดหวัง {
"คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อต่อ (ใช่/ไม่ใช่)" {send "yes\r";exp_continue}
-exact "รหัสผ่าน: " {ปิด}
-re $prompt {ส่ง "exit\r";close}
}
สรุป ปัญหาของฉันคือ สำหรับเครื่องที่ขอคำตอบว่า "ใช่" แล้วต้องการรหัสผ่าน ฉันต้องการลงทะเบียนใน ${sshnok}
ไฟล์แต่ ดำเนินต่อ
ไม่ทำงาน ฉันเหนื่อย ดำเนินต่อ
/ ต่อ 2
/ ต่อ 3
และยังไม่อยากย้อนกลับไปในลูปก่อนหน้า