Làm cách nào tôi có thể ngăn phiên SSH bị treo trong OS X Terminal?


101

Khi tôi đóng MacBook của mình bằng phiên SSH hoạt động trong Terminal và sau đó đánh thức nó, lời nhắc sẽ không phản hồi.

Trong khoảng năm phút nó nói

Write failed: Broken pipe

và chấm dứt.

Điều này cũng xảy ra khi tôi không gõ bất cứ thứ gì trong Terminal trong khoảng mười lăm phút.

Tôi có thể buộc OS X:

  1. Giữ kết nối SSH tồn tại lâu nhất có thể
  2. Giết nó ngay lập tức khi nó không phản hồi

?

Câu trả lời:


121

Để duy trì kết nối , bạn có thể kiểm tra /etc/ssh/ssh_configdòng thông ServerAliveIntervalbáo cho biết mức độ thường xuyên (tính bằng giây) mà máy tính của bạn sẽ gửi một gói null để duy trì kết nối. Nếu bạn có số 0 trong đó cho biết rằng máy tính của bạn không cố gắng duy trì kết nối (nó bị vô hiệu hóa), nếu không, nó sẽ cho bạn biết tần suất (tính bằng giây) mà nó đang gửi gói nói trên. Hãy thử đặt 120 hoặc 240, nếu nó vẫn giết kết nối của bạn, bạn có thể hạ xuống, có thể xuống 5, nếu với số đó thì điều đó không xảy ra, có thể chính bộ định tuyến của bạn đang kết nối bộ nhớ vào bộ nhớ trống.

Để giết nó khi bị treo , bạn có thể sử dụng ký tự thoát ssh:

~.

Đó là, nhấn dấu ngã và sau đó là khoảng thời gian, nếu nó không hoạt động, nhấn Enter trước khi bạn nhấn nó, điều đó sẽ giết kết nối ngay lập tức.


3
Ok, bạn có thể giết kết nối với ~., mẹo tuyệt vời! Nhưng nó thực sự làm gì?
CousinCocaine

Điều duy nhất tôi bối rối là liệu có hay không tôi phải khởi động lại sshd, nhưng có vẻ như vừa thoát khỏi phiên và kết nối lại đã thực hiện thủ thuật
dgig

Thường là ~. không làm việc cho tôi trong vài phút. Tại sao vậy?
Sridhar Sarnobat

2
Vị trí của ssh_config/etc/ssh/ssh_configtrên Mac OS X. Tôi sẽ tự chỉnh sửa câu trả lời, nhưng tôi không có đủ đại diện trên trang này để làm như vậy.
Erik B

Tôi nên đặt cái này vào máy khách hay máy chủ? Tôi nghĩ khách hàng, nhưng có thể rõ ràng hơn.
EralpB

23

Bạn có thể:

Định cấu hình hệ thống của bạn, toàn hệ thống, cho tất cả các kết nối Bằng cách chỉnh sửa: / etc / ssh / ssh_config Và thêm dòng:

ServerAliveInterval 10

Hoặc, trên mỗi máy chủ ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Điều này về cơ bản là nó sẽ giữ gói sống, cứ sau 10 giây ...


9

Bạn cũng có thể thử sử dụng dự án mosh tuyệt vời . Nó sẽ xử lý một cách duyên dáng các mất mạng, máy sẽ chuyển sang chế độ ngủ, v.v. và vui vẻ khôi phục kết nối khi bạn có mạng hoạt động trở lại.

Một giải pháp khác có thời gian hơn là sử dụng tmux trên máy từ xa. Trong trường hợp đó, bạn vẫn có thể nhận được một đường ống bị hỏng, nhưng nếu bạn kết nối lại vỏ của mình và các ứng dụng sẽ chờ đợi ngay khi bạn rời khỏi chúng.


Trên thực tế, đó chính xác là những gì tôi đang làm bây giờ.
Dan

5

Các câu trả lời khác nhau ở đây là xung đột về đường dẫn chính xác đến các tệp cấu hình. Có lẽ nó là khác nhau trong unixes khác nhau? Tôi đề nghị đọc các trang người đàn ông trên hệ thống của bạn!

Trong man ssh (1) , tìm kiếm văn bản: config . Trên hệ thống của tôi, tôi có một lựa chọn các tệp cấu hình toàn hệ thống hoặc người dùng này (và các đường dẫn khác nhau một cách kỳ lạ).

Trong man ssh_config (5) , tìm kiếm văn bản: còn sống . Trên hệ thống của tôi, có vẻ như tôi cần đặt cả ServerAliveIntervalServerAliveCountMax .

Điều làm việc cho tôi, trên macOS 10.12 Sierra, là đặt hai dòng sau vào ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Bây giờ tôi có thể ssh đến máy chủ Ubuntu 16.04 của mình mà không cần ngắt kết nối trong 20 * 180 giây = 1 giờ. Làm cho ngày của tôi!


3

Tự động kết nối lại ssh sau khi ngủ hoặc gián đoạn wifi

  1. Cài đặt tự động từ MacPorts hoặc Homebrew:brew install autossh

  2. Mở Terminal và chạy autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Ngắt kết nối wifi hoặc đặt máy Mac của bạn vào chế độ ngủ.

  4. Khi bạn kết nối lại với wifi, phiên ssh sẽ tự động kết nối lại.


Tự động ssh sau khi đăng nhập

Jon Stacey đã viết một bài đăng trên blog về việc tự động kích hoạt phiên ssh khi bạn đăng nhập.

  1. Cài đặt tự động từ MacPorts hoặc Homebrew:brew install autossh

  2. Tạo một quy trình làm việc của Automator với một tập lệnh bash.

Kịch bản shell tự động

  1. Đi đến mục đăng nhập trong Tùy chọn hệ thống .

Tùy chọn hệ thống> Mục đăng nhập

  1. Thêm quy trình công việc Automator của bạn vào các mục Đăng nhập .

Mục đăng nhập


1

Thêm hai dòng này vào /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes

1

Chỉ cần giải quyết vấn đề này thêm các dòng sau vào $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Cài đặt TCPKeepAlive nocho khách hàng biết rằng kết nối vẫn tốt cho đến khi được chứng minh bằng yêu cầu của người dùng, nghĩa là ngắt kết nối tạm thời trong khi thuật ngữ ssh của bạn không hoạt động trong nền sẽ không giết kết nối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.