วิธีหลีกเลี่ยงการหมดเวลาเชื่อมต่อ ssh & การแช่แข็งเทอร์มินัล GNOME


235

เมื่อฉันเชื่อมต่อผ่าน ssh กับเซิร์ฟเวอร์บางตัวมันจะหมดเวลาและ "หยุด" เทอร์มินัล (ไม่ยอมรับอินพุตไม่ตัดการเชื่อมต่อไม่สามารถ Ctrl-C เพื่อฆ่ากระบวนการ ssh หรืออะไรก็ได้)

นี่เป็นของ Ubuntu gnome-terminalแม้ว่าดูเหมือนว่าจะเป็นการหยุดอินพุต / เอาท์พุตของเครื่องเทอร์มินัลชั่วคราวและจะไม่ส่งผลกระทบต่อการทำงานของซอฟต์แวร์เทอร์มินัล GNOME เอง จึงมีข้อผิดพลาดgnome-terminalน้อยกว่าความขัดแย้งที่น่ารำคาญกับ ssh

ดังนั้นมีวิธีการป้องกัน / คืนขั้วจากการเชื่อมต่อ ssh ที่หมดเวลาหรือไม่


คำตอบ:


256

sshd (เซิร์ฟเวอร์) ปิดการเชื่อมต่อหากไม่ได้ยินเสียงใด ๆ จากไคลเอ็นต์ชั่วครู่หนึ่ง คุณสามารถบอกให้ไคลเอนต์ของคุณส่งสัญญาณ sign-of-life ไปยังเซิร์ฟเวอร์เป็นครั้งคราว

~/.ssh/configการกำหนดค่าสำหรับเรื่องนี้คือในแฟ้ม เพื่อส่งสัญญาณทุกสี่นาทีเพื่อ RemoteHost ~/.ssh/configใส่ต่อไปนี้ในของคุณ

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

~/.ssh/configนี่คือสิ่งที่ฉันมีในของฉัน

หากต้องการเปิดใช้งานสำหรับโฮสต์ทั้งหมดให้ใช้:

Host *
  ServerAliveInterval 240

นอกจากนี้ตรวจสอบให้แน่ใจว่าเรียกใช้chmod 600 ~/.ssh/configเนื่องจากไฟล์กำหนดค่าต้องไม่สามารถอ่านได้ทั่วโลก


1
ขอบคุณ sblair ที่ช่วยฉันด้วยถ้อยคำมันดีมาก ฉันเปลี่ยน "ไม่ควร" กลับไปที่ "ต้องไม่" เพราะ ssh ตรวจสอบสิทธิ์ของไฟล์และถ้ามันเป็นโลกหรือกลุ่มที่อ่านได้มันล้มเหลว
Ludwig Weinzierl

1
นี่ไม่ใช่สิ่งที่ OP ถาม เขาไม่ได้ถูกเตะออกเนื่องจากไม่มีกิจกรรม เขาพยายามเชื่อมต่อและเทอร์มินัลของเขาหยุดนิ่ง
Cerin

ไหนนี้คือ~/.ssh/config?
ผู้ใช้

1
@User '~ /' หมายถึงโฟลเดอร์บ้านของคุณ '.ssh' เป็นโฟลเดอร์ภายในโฟลเดอร์บ้านของคุณ
wkm

6
นี่มันไร้ประโยชน์ถ้าการเชื่อมต่อของคุณกำลังจะหายไป ...
so12311

248

กดEnter, ~, .หนึ่งหลังจากที่อื่น ๆ ที่จะตัดการเชื่อมต่อจากเซสชันแช่แข็ง

ส่วน "ตัวอักษรหลบหนี" ในหน้า ssh อธิบายรายละเอียดพื้นฐาน


40
คำตอบนี้ปรากฏขึ้นสำหรับฉันที่จะตอบคำถามได้อย่างแม่นยำมากขึ้นและในทุกกรณีคือคำตอบที่ฉันต้องการ
CoatedMoose

โปรดทราบว่าคุณต้องยกเลิกการใส่เครื่องหมายEscapeChar ~ในบรรทัด/etc/ssh/ssh_config(หรือ~/.ssh/ssh_configหากคุณต้องการ)
Aditya MP

@adityamenon No EscapeChar ~เป็นค่าเริ่มต้นในตัวอยู่แล้ว
Peter Eisentraut

2
@ ทำเครื่องหมายคำถามที่ถามว่า "มีวิธีใดที่จะป้องกันไม่ให้เครื่องคืนจากการเชื่อมต่อ ssh ที่หมดเวลาหรือไม่" เน้นการขุด
เคลือบผิว

2
แม้ว่ามันจะไม่ถูกต้องในบริบทของคำถามนี่คือสิ่งที่ฉันต้องการ
Subin Sebastian

38

แม้ว่าสรรพสิ่งนี้ไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรง แต่ก็เกี่ยวข้องกับปัญหาที่คุณมี แทนการพยายามที่จะให้การเชื่อมต่อมีชีวิตอยู่ (การเชื่อมต่อทั้งหมดตายในที่สุด) คุณสามารถใช้ multiplexors ขั้วเช่นscreenและtmuxที่ทำให้ช่วงที่มีชีวิตอยู่ในพื้นหลังแม้ว่า terminal ของคุณได้รับการตัดการเชื่อมต่อ

เป็นหลักเมื่อคุณเข้าสู่เซิร์ฟเวอร์ SSH คุณจะเรียกใช้ทันทีscreenซึ่งจะสร้างและแนบเซสชันใหม่:

$ screen

จากนั้นคุณไปข้างหน้าและทำงานกับเชลล์ตามปกติ ตอนนี้หากการเชื่อมต่อหลุดเมื่อคุณกลับมาออนไลน์และเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน SSH คุณจะได้รับรายการเซสชันปัจจุบันด้วย:

$ screen -ls

หากต้องการแนบเซสชันอีกครั้ง:

$ screen -r <session>

ที่<session>เป็น PID หรือชื่อเซสชั่น คุณจะได้รับการเชื่อมต่อกับเซสชันอีกครั้งและคุณสามารถดำเนินการต่อจากที่ค้างไว้!

คุณสามารถแยกเซสชั่นและเชื่อมต่อจากที่บ้านเพื่อรับจากจุดที่แน่นอนที่คุณออก เพื่อแยกเซสชั่นที่คุณใช้C-aตามด้วยC-d(thats Control + Aแล้วControl + D)

มีการสอนออนไลน์อย่างง่ายเช่นกัน

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


2
อีกทางเลือกหนึ่งคือใช้ mosh: mosh.mit.edu
Zombies

สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณใช้ฮอตสปอตหรือ wifi ที่บางครั้งอาจหยุดใช้
Randall

11

ลองต่อท้าย-o ServerAliveInterval=30สตริงการเชื่อมต่อของคุณ ( 30หมายถึง 30 วินาทีและสามารถปรับได้)


5

นอกจากนี้คุณยังสามารถตั้งค่าช่วงหมดเวลาที่ไม่ได้ใช้งานจากฝั่งเซิร์ฟเวอร์ SSH:

ไฟล์: /etc/ssh/ssh_config

เนื้อหา:

ClientAliveInterval XX
ClientAliveCountMax YY

วิธีนี้ทำงานในลักษณะเดียวกับการตั้งค่าไคลเอนต์ แต่แพ็คเก็ต null จะถูกส่งจากเซิร์ฟเวอร์แทนที่จะเป็นไคลเอ็นต์

สกัดจาก:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html


1

สำหรับผู้ที่ต้องการป้องกันไม่ให้ลูกค้าหมดเวลาในตอนแรก

คุณสามารถลองตั้งค่าConnectTimeout 0ในไฟล์กำหนดค่า ค่า 0 หมายถึงการเชื่อมต่อจะยังคงมีชีวิตอยู่โดยไม่มีกำหนดเว้นแต่จะปิด

ไฟล์ config (หรือ ssh_config) ของคุณอาจมีลักษณะเช่นนี้:

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