it-swarm-vi.com

Các tùy chọn `ServerAliveInterval` và` ClientAliveInterval` trong sshd_config chính xác là gì?

Tôi đã tìm thấy câu hỏi này , nhưng tôi xin lỗi tôi không hiểu lắm về cài đặt trên hai biến ServerAliveIntervalClientAliveInterval được đề cập trong phản hồi được chấp nhận. Nếu máy chủ cục bộ của tôi hết thời gian, tôi có nên đặt giá trị này thành 0 không? Nó sẽ không bao giờ hết thời gian? Thay vào đó tôi nên đặt nó thành 300 giây hay gì đó?

Câu hỏi của tôi chỉ đơn giản là, một số kết nối của tôi đã hết thời gian khi tôi tạm dừng và sau đó bỏ qua máy tính xách tay của mình với câu trả lời Write failed: Broken pipe và một số thì không. Làm cách nào tôi có thể định cấu hình chính xác một sshd cục bộ để chúng không bị hỏng với đường ống bị hỏng?

177
M. Tibbits

ServerAliveInterval : số giây mà máy khách sẽ đợi trước khi gửi gói null đến máy chủ (để duy trì kết nối) .

ClientAliveInterval : số giây mà máy chủ sẽ đợi trước khi gửi gói null đến máy khách (để duy trì kết nối) .

Đặt giá trị 0 (mặc định) sẽ vô hiệu hóa các tính năng này để kết nối của bạn có thể bị rớt nếu không hoạt động quá lâu.

ServerAliveInterval dường như là chiến lược phổ biến nhất để duy trì kết nối. Để ngăn sự cố đường ống bị hỏng, đây là cấu hình ssh tôi sử dụng trong tệp .ssh/config của mình:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

Cài đặt ở trên sẽ hoạt động theo cách sau,

  1. Máy khách sẽ chờ trong 60 giây (thời gian ServerAliveInterval) và gửi "gói null no-op" đến máy chủ và mong đợi phản hồi. Nếu không có phản hồi nào, thì nó sẽ tiếp tục thử quá trình trên cho đến 10 (ServerAliveCountMax) lần (600 giây). Nếu máy chủ vẫn không phản hồi, thì máy khách sẽ ngắt kết nối ssh.

ClientAliveCountMax ở phía máy chủ cũng có thể giúp ích. Đây là giới hạn thời gian khách hàng được phép không phản hồi trước khi bị ngắt kết nối. Giá trị mặc định là 3, như trong ba ClientAliveInterval.

227
Barthelemy

Điều này được giải thích trong sshd_config thủ công (man sshd_config):

ClientAliveInterval

Đặt khoảng thời gian chờ tính bằng giây sau đó nếu không nhận được dữ liệu từ máy khách, sshd sẽ gửi tin nhắn qua kênh được mã hóa để yêu cầu phản hồi từ máy khách. Mặc định là 0, cho biết các tin nhắn này sẽ không được gửi đến máy khách. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

ClientAliveCountMax

Giá trị mặc định là 3. Nếu ClientAliveInterval (xem bên dưới) được đặt thành 15 và ClientAliveCountMax được đặt ở mặc định, các máy khách SSH không phản hồi sẽ bị ngắt kết nối sau khoảng 45 giây. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

Đối với các tùy chọn máy khách, xem phần giải thích trong man ssh_config:

ServerAliveInterval

Đặt khoảng thời gian chờ tính bằng giây sau đó nếu không nhận được dữ liệu từ máy chủ, ssh sẽ gửi tin nhắn qua kênh được mã hóa để yêu cầu phản hồi từ máy chủ. Mặc định là 0, cho biết các tin nhắn này sẽ không được gửi đến máy chủ. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

ServerAliveCountMax

Giá trị mặc định là 3. Ví dụ: ServerAliveInterval được đặt thành 15 và ServerAliveCountMax được đặt ở mặc định, nếu máy chủ không phản hồi, ssh sẽ ngắt kết nối sau khoảng 45 giây. Tùy chọn này chỉ áp dụng cho giao thức phiên bản 2.

Dựa trên, 0 có nghĩa là nó bị vô hiệu hóa. Do đó, bạn nên đặt các giá trị này đủ cao để tránh Lỗi đường ống lỗi.

29
kenorb

Câu trả lời từ Barthelemy rất tuyệt nhưng không thực sự đi đến gốc rễ của vấn đề. Bạn tạm ngưng máy của mình và muốn phiên SSH vẫn còn hoạt động khi bạn khởi động máy tính.

Không có cấu hình như vậy cho ssh sẽ giữ kết nối sống như vậy. SSH sử dụng TCP, để bắt đầu, bạn cần bắt tay ba cách và sau đó tiếp tục sống sau một thời gian nhàn rỗi. Khi bạn tắt/ngủ đông, tất cả các kết nối TCP của bạn được đóng bằng FIN. Không có cách nào khắc phục điều đó.

Đối với một cách giải quyết bẩn, bạn có thể sử dụng VPS hoặc hộp trực tuyến khác có màn hình để giữ kết nối. Lời khuyên của tôi không làm điều đó vì lý do bảo mật.

20
3h4x

Vì bạn không thể đảm bảo rằng kết nối SSH (là TCP) sẽ vẫn tồn tại khi một đầu dừng gửi ACK đến các gói đã nhận, cá nhân tôi sử dụng http://www.hending.motd.ca/autossh/ = để khởi động lại tất cả các kết nối SSH của tôi gần như ngay khi tôi không cho phép.

Vì GNU Màn hình sẽ được sử dụng ở phía máy chủ, việc đính kèm lại đưa tôi đến nơi tôi đã ở trước đó.

Bạn có thể nghe nó trên các cổng bổ sung để nó liên tục kiểm tra các kết nối vẫn còn tồn tại, nhưng cá nhân tôi thấy nó hoạt động đủ tốt với tính năng bị vô hiệu hóa đó và chỉ dựa vào ServerAliveInterval/ServerAliveCountMax của SSH.

Một tùy chọn khác là http://mosh.mit.edu/ sử dụng UDP và phục hồi hoàn toàn từ sự thiếu kết nối lâu dài.

16
grifferz

Bạn cũng có thể chạy các lệnh với Nohup nếu bạn muốn chúng chạy bất kể kết nối SSH của bạn.

ví dụ.

$ Nohup tar -xzf some_huge.tar.gz &

Các & là, tôi nghĩ, không cần thiết, nhưng nó thuận tiện vì nó làm cho quá trình chạy trong nền để bạn có thể làm những việc khác.

Tôi luôn sử dụng Nohup cho bất kỳ quá trình nào mất một lúc, để tôi không phải bắt đầu lại nếu tôi mất kết nối vì bất kỳ lý do gì - mất điện (tại địa điểm từ xa của tôi, không phải tại Host), mất mạng, bất cứ điều gì.

5
Buttle Butkus

Đặt phiên chạy dài của bạn bên trong màn hình Xem màn hình -h để biết chi tiết

Bằng cách đó, bạn có thể kết nối lại với máy bằng ssh và reattach vào phiên màn hình

1
user180529