คำสั่งreboot -f
จะไม่ส่งคืน (เว้นแต่ว่าคุณไม่ได้รับอนุญาตให้ทำการรีบูต) ณ จุดที่มีการออกไคลเอนต์ SSH กำลังรอสิ่งที่จะทำซึ่งอาจเป็น:
- เซิร์ฟเวอร์ SSH แจ้งลูกค้าว่ามีบางสิ่งเกิดขึ้นที่ต้องการความสนใจตัวอย่างเช่นมีเอาต์พุตบางส่วนที่จะแสดงหรือว่าคำสั่งรีโมตเสร็จสิ้นแล้ว
- เหตุการณ์บางอย่างที่ฝั่งไคลเอ็นต์เช่นสัญญาณเพื่อถ่ายทอด
- ตัวจับเวลาเริ่มทำงานเพื่อให้ไคลเอ็นต์ส่งข้อความแบบ keepalive (และปิดการเชื่อมต่อหากเซิร์ฟเวอร์ไม่ตอบกลับ)
เนื่องจากกระบวนการเซิร์ฟเวอร์ SSH นั้นตายแล้วไคลเอ็นต์ SSH จะไม่ตายจนกว่าตัวจับเวลาจะเริ่มทำงาน
หากคุณทำงานssh remotehost 'reboot -f >/dev/null &'
แล้วสิ่งที่เกิดขึ้นคือ:
- เปลือกระยะไกลเปิดตัว
reboot
คำสั่งในพื้นหลัง
- เนื่องจากคำสั่งเชลล์ฝั่งเซิร์ฟเวอร์ออกแล้วและไม่มีกระบวนการเก็บไฟล์ descriptor สำหรับเอาต์พุตมาตรฐานเปิดเซิร์ฟเวอร์ SSH จะปิดการเชื่อมต่อ
reboot
คำสั่งเป็นสาเหตุที่ทำให้เครื่องที่จะรีบูต
อย่างไรก็ตามสิ่งนี้ไม่น่าเชื่อถือ: ขึ้นอยู่กับเวลาขั้นตอนที่ 3 อาจเกิดขึ้นก่อนขั้นตอนที่ 2 การเพิ่มตัวจับเวลาทำให้สิ่งนี้ไม่น่าเป็นไปได้:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
เพื่อให้แน่ใจอย่างแน่นอนว่าฝั่งเซิร์ฟเวอร์มุ่งมั่นที่จะทำงานreboot
ในขณะที่ตรวจสอบให้แน่ใจว่าไม่ได้รีบูตจริงก่อนที่จะแจ้งให้ลูกค้าทราบว่ามีการมุ่งมั่นคุณต้องมีการแจ้งเตือนเพิ่มเติมจากเซิร์ฟเวอร์ไปยังไคลเอนต์ สิ่งนี้สามารถส่งออกผ่านการเชื่อมต่อ SSH แต่มันก็ซับซ้อน