ฉันพบวิธีแก้ปัญหาที่นี่: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
วิธีที่ดีที่สุด - อุโมงค์ที่ปิดอัตโนมัติ
ตามที่ได้รับการกล่าวถึงก่อนหน้านี้แทนที่จะใช้การรวมสวิตช์ -f -N เราสามารถใช้ -f เพียงอย่างเดียว แต่ยังรันคำสั่งบนเครื่องระยะไกล แต่คำสั่งใดที่ควรดำเนินการเนื่องจากเราต้องเริ่มต้นช่องสัญญาณเท่านั้น
นี่คือเมื่อการนอนหลับสามารถเป็นคำสั่งที่มีประโยชน์ที่สุดของทั้งหมด! ในสถานการณ์พิเศษนี้การนอนหลับมีข้อดีสองประการ:
- มันไม่ทำอะไรเลยดังนั้นจึงไม่มีการใช้ทรัพยากร
- ผู้ใช้สามารถระบุระยะเวลาที่จะดำเนินการ
ความช่วยเหลือเหล่านี้ในการปิดอุโมงค์ ssh อัตโนมัติได้อธิบายไว้ด้านล่างนี้อย่างไร
เราเริ่มต้นเซสชัน ssh ในพื้นหลังขณะดำเนินการคำสั่ง sleep เป็นเวลา 10 วินาทีบนเครื่องระยะไกล จำนวนวินาทีไม่สำคัญ ในเวลาเดียวกันเรารัน vncviewer เหมือนก่อนหน้านี้:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
ในกรณีนี้ไคลเอนต์ ssh ได้รับคำสั่งให้แยกเซสชั่น ssh ไปที่พื้นหลัง (-f) สร้างอุโมงค์ (-L 25901: 127.0.0.1: 5901) และดำเนินการคำสั่ง sleep บนเซิร์ฟเวอร์ระยะไกลเป็นเวลา 10 วินาที (sleep 10)
ความแตกต่างระหว่างวิธีนี้และวิธีก่อนหน้านี้ (สวิตช์ -N) โดยทั่วไปคือในกรณีนี้เป้าหมายหลักของไคลเอ็นต์ ssh ไม่ได้สร้างอุโมงค์ แต่ให้ดำเนินการคำสั่ง sleep เป็นเวลา 10 วินาที การสร้างอุโมงค์เป็นเป้าหมายรองข้างเคียง หากไม่ได้ใช้ vncviewer ไคลเอ็นต์ ssh จะออกหลังจากระยะเวลา 10 วินาทีเนื่องจากไม่มีงานทำอีกต่อไปทำลายอุโมงค์ในเวลาเดียวกัน
ในระหว่างการดำเนินการคำสั่ง sleep หากกระบวนการอื่น vncviewer ในกรณีนี้เริ่มใช้ tunnel นั้นและทำให้มันครอบครองเกินระยะเวลา 10 วินาทีดังนั้นแม้ว่าไคลเอ็นต์ ssh จะทำงานระยะไกล (การดำเนินการ sleep) จะไม่สามารถทำได้ ออกเนื่องจากกระบวนการอื่นตรงบริเวณอุโมงค์ กล่าวอีกนัยหนึ่งไคลเอ็นต์ ssh ไม่สามารถทำลายอุโมงค์ได้เนื่องจากจะต้องฆ่า vncviewer ด้วยเช่นกัน เมื่อ vncviewer หยุดใช้อุโมงค์ดังนั้นไคลเอ็นต์ ssh ก็ออกไปเช่นกันเนื่องจากบรรลุเป้าหมายแล้ว
ด้วยวิธีนี้ไม่มีกระบวนการ ssh ถูกปล่อยให้ทำงานในพื้นหลัง
/tmp/session1
(แนะนำให้ตั้งชื่อโดยใช้รูปแบบ% - ดูคำอธิบายControlPathในman ssh_config
)