ทำให้เซสชัน SSH มีชีวิตอยู่ [ปิด]


241

ฉันใช้ssh -p8520 username@remote_hostเพื่อเข้าสู่ระบบเซิร์ฟเวอร์ระยะไกล

ปัญหา :

มันเชื่อมต่ออยู่เสมอและทำงานอย่างถูกต้องเมื่อฉันอยู่ในที่ทำงาน น่าเสียดายที่เทอร์มินัลค้างใน 10 - 15 นาทีหลังจากที่ฉันเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลจากที่บ้าน

ไม่มีรายงานข้อผิดพลาด / หมดเวลาบนคอนโซล แต่เคอร์เซอร์ไม่สามารถย้ายได้อีก

เมื่อเข้าสู่wการตรวจสอบผู้ใช้เข้าสู่ระบบผู้ใช้งานเข้าสู่ระบบ zombies บางคนอยู่ที่นั่นและฉันต้องฆ่าพวกเขาด้วยตนเอง

มันค่อนข้างน่ารำคาญ มีใครช่วยฉันบ้าง


screenฉันมีนี้มากเกินไปผมเริ่มที่จะใช้ บางทีนี่อาจเป็นปัญหาการหมดเวลาบางอย่าง
martin

@martin screenช่วยให้โปรแกรมทำงานต่อไป น่าเสียดายที่บางครั้งฉันต้องทำงานกับเซิร์ฟเวอร์ระยะไกล :(
Haifeng Zhang

หากคุณเริ่มต้นโดยไม่มีพารามิเตอร์สิ่งนี้จะให้เชลล์แก่คุณ
martin

คุณพูดscreenเท่านั้นหรือ มันสามารถแก้ปัญหาการเชื่อมต่อที่หายไป? ไม่มีscreen -S screenName? ฉันมักจะใช้หน้าจอด้วย-Sและ-r
Haifeng Zhang

1
ไม่สิ่งนี้ไม่ได้แก้ปัญหาคุณหลีกเลี่ยงการสูญเสียงานในเทอร์มินัลเท่านั้น หากคุณไม่ทำอะไรเลยมันจะหยุดนิ่งคุณสามารถรับตำแหน่งที่คุณเริ่มได้ screenฉันหมายความว่าคุณสามารถสร้างสถานีที่คุณมักจะสามารถดำเนินการต่อโดยใช้ ดูเหมือนว่าคุณจะรู้แล้ว;)
มาร์ติน

คำตอบ:


450

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

การกำหนดค่าสำหรับสิ่งนี้อยู่ในไฟล์$HOME/.ssh/configสร้างไฟล์หากไม่มีอยู่ (ไฟล์กำหนดค่าต้องไม่สามารถอ่านได้ทั่วโลกดังนั้นให้เรียกใช้chmod 600 ~/.ssh/configหลังจากสร้างไฟล์) ในการส่งสัญญาณทุก ๆ สี่นาที (240 วินาที) ไปยังรีโมตโฮสต์ให้ทำดังต่อไปนี้ในไฟล์กำหนดค่า:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

ในการเปิดใช้งานการส่งสัญญาณแบบ keep-alive สำหรับโฮสต์ทั้งหมดให้วางเนื้อหาต่อไปนี้ในไฟล์กำหนดค่า:

Host *
    ServerAliveInterval 240

24
@ user271996 เหตุใดจึงควรรีสตาร์ท daemon สำหรับการตั้งค่าฝั่งไคลเอ็นต์
maxschlepzig

การกำหนดค่าจะต้องเขียนได้โดยผู้ใช้เท่านั้น การอ่านไม่ได้เป็นปัญหา การใช้ 600 เป็นระดับสิทธิ์ของคุณนั้นใช้ได้เนื่องจากผู้ใช้สามารถเขียนได้เท่านั้น
jbruni

1
ในกรณีที่มันไม่ชัดเจนไฟล์กำหนดค่านี้อยู่ในกล่อง PC / linux ของคุณ
zzapper

5
ฉันมักจะทำให้เกิดความสับสนเกี่ยวกับชื่อของการตั้งค่า: การใช้งานของลูกค้าในขณะที่การใช้งานเซิร์ฟเวอร์ServerAliveInterval ClientAliveInterval ช่างเป็นระเบียบ
youkaichao

@youkaichao มักจะมีความสับสนนี้ ในฐานะนักออกแบบ API มีเหตุผลที่ฉันอาจวางไว้ทั้งสองวิธี ในที่สุดสิ่งที่สำคัญที่สุดคือเอกสารที่ดีของมาตรฐานที่เลือก
Cameron Tacklind

170

ฉันต้องการโซลูชันแบบครั้งเดียว:

ssh -o ServerAliveInterval=60 myname@myhost.com

เก็บไว้ในนามแฝง:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

ตอนนี้สามารถเชื่อมต่อเช่นนี้:

me@MyMachine:~$ sshprod

12
มันเจ๋ง แต่ไม่ใช่ "โซลูชั่นแบบครั้งเดียว" อย่างแน่นอน หากคุณกำลังจะเชื่อมต่อกับเซิร์ฟเวอร์มากกว่าหนึ่งครั้งทำไมไม่ทำHost *& ServerAliveInterval 240(หรือระบุชื่อโฮสต์หากคุณต้องการเพียงแค่myname@myhost.comในคำตอบของ rockymonkey555 การตั้งชื่อแทนดูไม่ง่ายขึ้นเลย
Lambart

8
หรือเพียงแค่สร้างนามแฝงใน ~ / .bashrc ของคุณ:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
เขาหมายถึง "ครั้งเดียว" ในขณะที่ "ใช้งานได้เพียงครั้งเดียว" ไม่ใช่ "ฉันต้องเขียนครั้งเดียวเท่านั้น"
Jonathan Hartley

1
ใช่ถ้าคุณอ่าน "หนึ่งครั้ง" ว่า "ใช้ครั้งเดียว" การทำงานจะสมบูรณ์แบบ
philraj

ถ้าคุณต้องการ "หนึ่งซับ" ว่าชุดServerAliveIntervalจะ60ดี อย่างไรก็ตามการใช้นามแฝงทุบตีเมื่อคุณสามารถใช้.ssh/configเป็นเพียงโง่
Cameron Tacklind

50

สำหรับผู้ที่สงสัย @ edward-coast

หากคุณต้องการตั้งค่า keep alive สำหรับเซิร์ฟเวอร์ให้เพิ่มสิ่งนี้ใน/etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : ตั้งค่าช่วงเวลาหมดเวลาเป็นวินาทีหลังจากนั้นหากไม่ได้รับข้อมูลจากลูกค้า sshd (8) จะส่งข้อความผ่านแชนเนลที่เข้ารหัสเพื่อร้องขอการตอบสนองจากลูกค้า

ClientAliveCountMax : ตั้งค่าจำนวนข้อความที่ยังมีชีวิตของลูกค้า (ดูด้านล่าง) ซึ่งอาจถูกส่งโดยไม่ใช้ sshd (8) ได้รับข้อความใด ๆ กลับมาจากลูกค้า หากถึงเกณฑ์นี้ในขณะที่ลูกค้าส่งข้อความที่ยังมีชีวิตอยู่ sshd จะยกเลิกการเชื่อมต่อกับไคลเอ็นต์และยกเลิกเซสชัน


ดูเหมือนว่าไม่มี "พารามิเตอร์" ดังกล่าวเป็น ClientAliveInterval เฉพาะ ServerAliveInterval คุณสามารถตรวจสอบในหน้าคู่มือ "man ssh_config"
dtj

6
นั่นคือสิ่งที่ไม่ถูกต้องดูใน "man sshd_config" สำหรับส่วนเซิร์ฟเวอร์ที่ใช้งาน ssh daemon ไม่ใช่ไคลเอ็นต์ config
Jeff Davenport

ฉันควรใช้ClientAliveIntervalเพื่อให้เซิร์ฟเวอร์ตรวจสอบไคลเอนต์ยังมีชีวิตอยู่หรือฉันควรปล่อยให้ไคลเอ็นต์ "ping" เซิร์ฟเวอร์ServerAliveIntervalซ้ำ ๆ ทั้งสองดูเหมือนจะไม่สมเหตุสมผล
qrtLs

1
ตั้งค่าเฉพาะClientAliveIntervalบนเซิร์ฟเวอร์หากคุณต้องการให้เซิร์ฟเวอร์ยกเลิกการเชื่อมต่อกับการเชื่อมต่อที่ไม่ทำงานและคุณสามารถกำหนดความถี่และเวลาที่เกิดขึ้นได้
Jeff Davenport


10

เราสามารถทำให้การเชื่อมต่อ SSH ของเรายังคงอยู่ได้โดยการติดตามการกำหนดค่าทั่วโลก

เพิ่มบรรทัดต่อไปนี้ลงใน/etc/ssh/ssh_configไฟล์:

ServerAliveInterval 60

ใช้งานได้เฉพาะกับลูกค้าหรือไม่ก็ทำงานให้กับ sshd?
Edward Coast

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