ฉันจะป้องกันเซสชัน SSH ไม่ให้ห้อยใน OS X Terminal ได้อย่างไร


101

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

ในเวลาประมาณห้านาทีมันก็บอกว่า

Write failed: Broken pipe

และยุติ

สิ่งนี้เกิดขึ้นเมื่อฉันไม่พิมพ์อะไรในเทอร์มินัลในเวลาประมาณสิบห้านาที

ฉันสามารถบังคับให้ OS X เป็น:

  1. รักษาการเชื่อมต่อ SSH ให้มีชีวิตอยู่ได้นานที่สุด
  2. ฆ่ามันทันทีที่มันไม่ตอบสนอง

?

คำตอบ:


121

เพื่อให้การเชื่อมต่อยังคงอยู่คุณสามารถตรวจสอบใน/etc/ssh/ssh_configบรรทัดที่ระบุServerAliveIntervalไว้ซึ่งจะบอกคุณว่าคอมพิวเตอร์ของคุณจะส่งแพ็คเก็ต null เพื่อให้การเชื่อมต่อยังมีชีวิตอยู่ (ในหน่วยวินาที) หากคุณมีเลข 0 อยู่ที่นั่นแสดงว่าคอมพิวเตอร์ของคุณไม่ได้พยายามรักษาการเชื่อมต่อให้เป็นปกติ (ถูกปิดใช้งาน) มิฉะนั้นเครื่องจะบอกคุณว่าความถี่ (เป็นวินาที) นั้นจะส่งแพ็คเก็ตดังกล่าวหรือไม่ ลองใส่ใน 120 หรือ 240 ถ้ามันยังคงฆ่าการเชื่อมต่อของคุณคุณสามารถลดลงได้ถึง 5 หรือถ้าจำนวนนั้นไม่เกิดขึ้นบางทีเราเตอร์ของคุณที่ทิ้งการเชื่อมต่อไปยังหน่วยความจำฟรี

สำหรับการฆ่ามันเมื่อมันวางสายคุณสามารถใช้ ssh escape character:

~.

นั่นคือกดเครื่องหมายตัวหนอนแล้วตามระยะเวลาหากไม่ได้ผลให้กด Enter ก่อนที่คุณจะกดปุ่มนั่นจะเป็นการฆ่าการเชื่อมต่อทันที


3
ตกลงคุณสามารถฆ่าการเชื่อมต่อด้วย~.เคล็ดลับที่ยอดเยี่ยม! แต่มันทำอะไรได้จริง?
CousinCocaine

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

บ่อยครั้งที่ ~ ไม่ทำงานสำหรับฉันเป็นเวลาหลายนาที ทำไมถึงเป็นอย่างนั้น?
Sridhar Sarnobat

2
ตำแหน่งของที่ssh_configอยู่/etc/ssh/ssh_configบน Mac OS X ฉันจะแก้ไขคำตอบด้วยตัวเอง แต่ฉันมีตัวแทนไม่เพียงพอในไซต์นี้
Erik B

ฉันควรใส่สิ่งนี้ลงในไคลเอนต์หรือเซิร์ฟเวอร์? ฉันคิดว่าลูกค้า แต่สามารถชัดเจน
EralpB

23

คุณสามารถ:

กำหนดค่าระบบของคุณทั้งระบบสำหรับการเชื่อมต่อทั้งหมดโดยการแก้ไข: / etc / ssh / ssh_config และเพิ่มบรรทัด:

ServerAliveInterval 10

หรือต่อเซิร์ฟเวอร์~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

สิ่งนี้โดยพื้นฐานแล้วมันจะส่งแพ็คเก็ตมีชีวิตทุก ๆ 10 วินาที ...


9

คุณสามารถลองใช้โปรเจค mosh ที่ยอดเยี่ยม มันจะจัดการกับการสูญเสียของเครือข่ายอย่างสง่างามเครื่องที่จะเข้าสู่โหมดสลีปและอื่น ๆ และคืนค่าการเชื่อมต่ออย่างมีความสุขเมื่อคุณมีเครือข่ายที่ใช้งานได้อีกครั้ง

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


จริงๆแล้วนั่นคือสิ่งที่ฉันกำลังทำอยู่ตอนนี้
ด่าน

5

คำตอบต่าง ๆ ที่นี่มีข้อขัดแย้งเกี่ยวกับเส้นทางที่แน่นอนไปยังไฟล์กำหนดค่า อาจแตกต่างกันในระบบยูนิกซ์ที่แตกต่างกันหรือไม่? ฉันแนะนำให้อ่าน man pages ในระบบของคุณ!

ในคน SSH (1)ค้นหาข้อความ: การตั้งค่า ในระบบของฉันฉันมีตัวเลือกไฟล์กำหนดค่าทั้งระบบหรือผู้ใช้นี้ (และพา ธ แตกต่างกันอย่างผิดปกติ)

ในคน ssh_config (5) , การค้นหาสำหรับข้อความ: ยังมีชีวิตอยู่ ในระบบของฉันมันดูเหมือนว่าฉันจะต้องตั้งทั้งServerAliveIntervalและServerAliveCountMax

สิ่งที่ได้ผลสำหรับฉันใน macOS 10.12 Sierra คือการใส่สองบรรทัดต่อไปนี้ลงใน ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

ตอนนี้ฉันสามารถ ssh ไปยังเซิร์ฟเวอร์ Ubuntu 16.04 ของฉันโดยไม่ตัดการเชื่อมต่อเป็นเวลา 20 * 180 วินาที = 1 ชั่วโมง ทำวันของฉัน!


3

เชื่อมต่อ ssh โดยอัตโนมัติอีกครั้งหลังจากการนอนหลับหรือการขัดจังหวะ wifi

  1. ติดตั้งautosshจาก MacPorts หรือ Homebrew:brew install autossh

  2. เปิด Terminal และเรียกใช้ autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. ตัดการเชื่อมต่อ wifi ของคุณหรือทำให้เครื่อง Mac ของคุณเข้าสู่โหมดสลีป

  4. เมื่อคุณเชื่อมต่อกับ wifi อีกครั้งเซสชัน ssh จะเชื่อมต่อใหม่โดยอัตโนมัติ


ssh โดยอัตโนมัติหลังจากเข้าสู่ระบบ

Jon Stacey เขียนโพสต์บล็อกเกี่ยวกับการเปิดใช้งานเซสชันsshโดยอัตโนมัติเมื่อคุณเข้าสู่ระบบ

  1. ติดตั้งautosshจาก MacPorts หรือ Homebrew:brew install autossh

  2. สร้างเวิร์กโฟลว์อัตโนมัติด้วยสคริปต์ทุบตี

สคริปต์เชลล์อัตโนมัติ

  1. ไปที่เข้าสู่ระบบรายการในการตั้งค่าระบบ

ค่ากำหนดของระบบ> รายการเข้าสู่ระบบ

  1. เพิ่มของคุณขั้นตอนการทำงานอัตโนมัติที่จะเข้าสู่ระบบรายการ

รายการเข้าสู่ระบบ


1

เพิ่มสองบรรทัดเหล่านี้ไปที่/etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes

1

$HOME/.ssh/configเพียงแค่การแก้ไขปัญหานี้เพิ่มบรรทัดต่อไปเหล่านี้ใน

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

การตั้งค่าTCPKeepAlive noบอกลูกค้าว่าจะถือว่าการเชื่อมต่อนั้นยังคงดีจนกระทั่งได้รับการพิสูจน์โดยคำขอของผู้ใช้ซึ่งหมายความว่าการเชื่อมต่อขาดชั่วคราวในขณะที่คำที่คุณใช้งานอยู่ในพื้นหลังจะไม่ฆ่าการเชื่อมต่อ

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