Cách ngăn chặn SSH ngắt kết nối nếu không hoạt động trong một thời gian


51

Tôi có kết nối ssh với một máy bị ngắt kết nối bởi máy đó sau 30 phút không có người dùng nhập vào. Tuy nhiên, nếu tôi bắt đầu một cái gì đó như top, kết nối vẫn còn sống. Vì đây là máy của khách hàng, tôi không thể cấu hình lại máy chủ SSH của máy đó. Vì vậy, tôi đang tìm cách để tự động phát hiện sự nhàn rỗi và bắt đầu một cái gì đó như thế nào top. Một loại "trình bảo vệ màn hình" cho Bash.

Tôi biết rằng tôi có thể làm điều đó với screen, nhưng không may screenlà không được cài đặt và tôi không thể cài đặt phần mềm. Vì vậy, tôi cần sử dụng những gì Bash cung cấp.

Để làm rõ: Tôi đang tìm kiếm một giải pháp mà tôi bắt đầu một lần sau khi đăng nhập, và sau đó tôi muốn sử dụng thiết bị đầu cuối đó, bỏ đi, quay lại hai giờ sau đó và tiếp tục làm việc, mà không cần gõ bất cứ điều gì trước khi đi. Ngoài ra, tôi không tìm đến công cụ đường hầm (cho rằng tôi khuyên các công cụ tuyệt vời sshuttle )

Có ý kiến ​​gì không?


Chỉ cần một lưu ý nhanh để làm cho màn hình rõ ràng và Keepalive không giống nhau: ví dụ: nếu ssh client hoặc máy chủ cử chỉ bị ngắt kết nối, phiên ssh của bạn sẽ bị chấm dứt ngay cả khi bạn bật KeepAlive, trong khi vỏ màn hình sẽ không bị chấm dứt .
MariusMatutiae

Câu trả lời:


78

Để làm rõ: Tôi đang tìm kiếm một giải pháp mà tôi bắt đầu một lần sau khi đăng nhập, và sau đó tôi muốn sử dụng thiết bị đầu cuối đó, bỏ đi, quay lại hai giờ sau đó và tiếp tục làm việc, mà không cần gõ bất cứ điều gì trước khi đi.

Vấn đề là có một cái gì đó (thường là tường lửa hoặc cân bằng tải), đang giảm các phiên nhàn rỗi. Nếu bạn định cấu hình bảo trì phiên, các thủ tục sẽ ngăn các thiết bị mạng coi phiên là không hoạt động.

Khắc phục sự cố OpenSSH của Linux / Unix / Cygwin :
Cách khắc phục đơn giản nhất là cho phép các ứng dụng khách ssh; ví dụ này sẽ gửi một ssh keepalive cứ sau 60 giây:

ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>

Nếu bạn muốn kích hoạt tính năng này trên tất cả các phiên của mình, hãy đặt cái này trong /etc/ssh/ssh_confighoặc ~/.ssh/config:

ServerAliveInterval 60

Để biết thêm thông tin, xem ssh_configtrang web

Sửa chữa Putty :

Lưu phần này vào "Cài đặt mặc định" PuTTY của bạn ...

  • Nhấp vào kết nối
  • Nhập 60 vào "Giây giữa các lần giữ"

putty_sccam


21

Ngoài câu trả lời của Mike Pennigton , tôi cũng muốn làm cho bạn biết ServerAliveCountMax.

  • Các ServerAliveIntervalsẽ gửi keepalive mỗi x giây (mặc định là 0 , vô hiệu hóa tính năng này nếu không được đặt để cái gì khác).
  • Điều này sẽ được thực hiện ServerAliveCountMaxlần nếu không nhận được phản hồi. Giá trị mặc định ServerAliveCountMax3 (xem manpage ssh_config ).

Ví dụ: Nếu bạn đặt ServerAliveIntervalthành 60 và để nguyên ServerAliveCountMaxnhư vậy, điều này có nghĩa là người giữ sẽ chỉ đợi 3 * 60 = 180 seconds = 3 phút trước khi thoát.

Để tăng điều này lên, ví dụ 2 giờ cố gắng duy trì kết nối, bạn có thể làm:

Mỗi lệnh:

Vì vậy, bạn nên xem xét để thiết lập

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

Kiên trì:

Để làm cho nó liên tục ghi nó vào /etc/ssh/ssh_config(sẽ áp dụng toàn hệ thống) hoặc ~/.ssh/config(sẽ chỉ áp dụng cho người dùng):

ServerAliveInterval 60
ServerAliveCountMax 120

Ghi chú

Như không thích chỉ ra chính xác , điều này có thể không phải là những gì bạn muốn, tùy thuộc vào tình huống của bạn:

  • Nếu bạn muốn nhanh chóng chấm dứt phiên ngay khi máy chủ không phản hồi nữa, bạn nên chọn giá trị thấp ServerAliveCountMax.
  • Nếu bạn quan tâm hơn đến việc giữ kết nối đã được thiết lập (ví dụ: bạn đi bằng tàu hỏa và có độ trễ cao), bạn nên chọn giá trị cao hơn ServerAliveCountMaxđể cho phép sshtiếp tục thiết lập lại kết nối.

Xem thêm:


1
Tôi xin lỗi, nhưng điều này là sai. ServerAliveCountMaxchỉ định số lượng tin nhắn còn sống của máy chủ có thể được gửi mà không nhận được bất kỳ tin nhắn nào từ máy chủ. Nếu bạn muốn sshđể thoát sau khi nó bị đóng băng (vì vậy mà bạn có thể khởi động lại nó), bạn có thực sự cần thiết ServerAliveCountMaxđể một thấp số. Xem trang man OP liên kết.
thích

@dislick Tôi đã phải suy nghĩ một chút về điều này, nhưng tôi nghĩ bạn đúng tùy thuộc vào ngữ cảnh, do đó tôi đã thêm một ghi chú để nhấn mạnh bối cảnh.
Murmel

2

Tôi đang sử dụng Mobaxterm và cũng đã gặp vấn đề này. Mobaxterm cũng cung cấp một tùy chọn để giữ cho máy khách còn sống khi máy khách không hoạt động. Tới Settings -> Configuration -> SSH. Có phần có tiêu đề SSH settings, kiểm tra tùy chọn SSH keepalive. Sau đó, vấn đề sẽ biến mất.

nhập mô tả hình ảnh ở đây


"Keepalive" có hoạt động ở phiên bản miễn phí không ... phiên của tôi bị ngắt kết nối ngay cả sau khi kiểm tra tùy chọn này
lấy mẫu

Có nó hoạt động. Vấn đề của bạn có thể có nguyên nhân khác.
jdhao
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.