วิธีป้องกัน SSH จากการตัดการเชื่อมต่อหากไม่ได้ใช้งานเป็นระยะเวลาหนึ่ง


51

ฉันมีการเชื่อมต่อ ssh กับเครื่องที่ถูกตัดการเชื่อมต่อโดยเครื่องหลังจาก 30 นาทีที่ไม่มีการป้อนข้อมูลจากผู้ใช้ อย่างไรก็ตามถ้าฉันเริ่มบางสิ่งบางอย่างtopการเชื่อมต่อยังคงอยู่ เนื่องจากนี่เป็นเครื่องของไคลเอ็นต์ฉันจึงไม่สามารถกำหนดค่าเซิร์ฟเวอร์ SSH ของเครื่องนั้นใหม่ topดังนั้นฉันกำลังมองหาวิธีที่จะตรวจสอบโดยอัตโนมัติเกียจคร้านและเริ่มต้นสิ่งที่ต้องการ ชนิดของ "สกรีนเซฟเวอร์" สำหรับ Bash

ฉันรู้ว่าฉันสามารถทำได้ด้วยscreenแต่น่าเสียดายที่screenไม่ได้ติดตั้งและฉันไม่สามารถติดตั้งซอฟต์แวร์ได้ ดังนั้นฉันต้องใช้สิ่งที่ Bash เสนอ

เพื่อให้ชัดเจน: ฉันกำลังมองหาโซลูชันที่ฉันเริ่มหลังจากเข้าสู่ระบบแล้วฉันต้องการใช้เทอร์มินัลนั้นเดินไปกลับมาอีกสองชั่วโมงต่อมาและทำงานต่อไปโดยไม่ต้องพิมพ์อะไรก่อนเดินออกไป นอกจากนี้ฉันไม่ได้มองหาสิ่งอุโมงค์ (เพราะฉันแนะนำเครื่องมือที่ดีsshuttle )

ความคิดใด ๆ


เพียงโน้ตย่อที่จะทำให้หน้าจอชัดเจนและ Keepalive ไม่ใช่สิ่งเดียวกัน: ตัวอย่างเช่นหากไคลเอ็นต์ ssh หรือเซิร์ฟเวอร์ไม่ได้เชื่อมต่อเซสชัน ssh ของคุณจะถูกยกเลิกแม้ว่าคุณจะเปิดไว้ KeepAlive ในขณะที่เชลล์หน้าจอจะไม่ถูกยกเลิก .
MariusMatutiae

คำตอบ:


78

เพื่อให้ชัดเจน: ฉันกำลังมองหาโซลูชันที่ฉันเริ่มหลังจากเข้าสู่ระบบแล้วฉันต้องการใช้เทอร์มินัลนั้นเดินไปกลับมาอีกสองชั่วโมงต่อมาและทำงานต่อไปโดยไม่ต้องพิมพ์อะไรก่อนเดินออกไป

ปัญหาคือมีบางอย่าง (โดยปกติคือไฟร์วอลล์หรือโหลดบาลานเซอร์) ซึ่งกำลังปล่อยเซสชันที่ไม่ทำงาน หากคุณกำหนดค่า Keepalives ของเซสชัน Keepalives จะป้องกันอุปกรณ์เครือข่ายจากการพิจารณาว่าเซสชันว่าง

การแก้ไข Linux / Unix / Cygwin OpenSSH :
การแก้ไขที่ง่ายที่สุดคือการเปิดใช้งาน Keepalives ของไคลเอ็นต์ ssh; ตัวอย่างนี้จะส่ง ssh keepalive ทุก 60 วินาที:

ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>

หากคุณต้องการเปิดใช้งานสิ่งนี้ในทุกเซสชันของคุณให้ใส่สิ่งนี้ใน/etc/ssh/ssh_configหรือ~/.ssh/config:

ServerAliveInterval 60

สำหรับข้อมูลเพิ่มเติมดูssh_configmanpage

ผงสำหรับอุดรู :

บันทึกสิ่งนี้ลงใน PuTTY "การตั้งค่าเริ่มต้น" ของคุณ ...

  • คลิกที่การเชื่อมต่อ
  • พิมพ์ 60 เป็น "วินาทีระหว่าง keepalives"

putty_screenshot


21

นอกจากคำตอบของ Mike Pennigtonแล้วฉันต้องการแจ้งให้คุณทราบServerAliveCountMaxด้วย

  • ServerAliveIntervalจะส่ง keepalive ทุก x วินาที (ค่าปกติคือ0ซึ่งปิดใช้งานคุณลักษณะนี้ถ้าไม่ได้ตั้งค่าอย่างอื่น)
  • สิ่งนี้จะเสร็จสิ้นServerAliveCountMaxหากไม่ได้รับคำตอบ ค่าเริ่มต้นServerAliveCountMaxคือ3 (ดูmanpage ssh_config )

ตัวอย่าง: หากคุณตั้งค่าServerAliveIntervalเป็น60และปล่อยให้ServerAliveCountMaxเป็นเช่นนี้หมายความว่า keepalive จะรอเพียง3 * 60 = 180 seconds = 3นาทีก่อนที่จะออก

หากต้องการเพิ่มสิ่งนี้เป็นเช่น 2 ชั่วโมงของการพยายามรักษาการเชื่อมต่อให้มีชีวิตอยู่คุณสามารถทำได้:

ต่อคำสั่ง:

ดังนั้นคุณควรพิจารณาตั้ง

ssh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 120" <SERVER_ADDRESS>

หมั่น:

ในการทำให้เขียนต่อเนื่อง/etc/ssh/ssh_config(จะใช้กับทั้งระบบ) หรือ~/.ssh/config(จะใช้กับผู้ใช้เท่านั้น):

ServerAliveInterval 60
ServerAliveCountMax 120

บันทึก

เนื่องจากไม่ได้ชี้ให้เห็นอย่างถูกต้องนี่อาจไม่ใช่สิ่งที่คุณต้องการขึ้นอยู่กับสถานการณ์ของคุณ:

  • ServerAliveCountMaxหากคุณต้องการได้อย่างรวดเร็วยุติเซสชั่นทันทีที่เซิร์ฟเวอร์ไม่ตอบสนองอีกต่อไปคุณควรเลือกค่าต่ำ
  • หากคุณมีความสนใจในการรักษาการเชื่อมต่อที่สร้างไว้แล้ว (เช่นคุณเดินทางโดยรถไฟและมีเวลาหน่วงสูง) คุณควรเลือกค่าที่สูงขึ้นServerAliveCountMaxเพื่ออนุญาตsshให้พยายามสร้างการเชื่อมต่อต่อไป

ดูสิ่งนี้ด้วย:


1
ฉันขอโทษ แต่มันผิด ServerAliveCountMaxระบุจำนวนข้อความสดของเซิร์ฟเวอร์ซึ่งอาจถูกส่งโดยไม่ได้รับข้อความใด ๆ กลับมาจากเซิร์ฟเวอร์ หากคุณต้องการsshออกหลังจากที่ค้าง (เพื่อให้คุณสามารถรีสตาร์ทได้) คุณควรตั้งค่าServerAliveCountMaxเป็นจำนวนต่ำ ดูลิงค์manpage OP
ปฏิเสธ

@dickick ฉันต้องคิดเกี่ยวกับเรื่องนี้เล็กน้อย แต่ฉันคิดว่าคุณถูกต้องขึ้นอยู่กับบริบทดังนั้นฉันจึงเพิ่มบันทึกย่อเพื่อเน้นบริบท
Murmel

2

ฉันใช้ Mobaxterm และยังพบกับปัญหานี้ Mobaxterm ยังมาพร้อมกับตัวเลือกเพื่อให้ไคลเอนต์ยังคงอยู่เมื่อไคลเอนต์ไม่ได้ใช้งาน Settings -> Configuration -> SSHไปที่ มีส่วนบรรดาศักดิ์SSH settings, SSH keepaliveตรวจสอบตัวเลือก จากนั้นปัญหาจะหายไป

ป้อนคำอธิบายรูปภาพที่นี่


"SSH keepalive" ทำงานในรุ่นฟรีหรือไม่ ... เซสชันของฉันกำลังถูกตัดการเชื่อมต่อแม้ว่าจะตรวจสอบตัวเลือกนี้แล้ว
samshers

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