Giữ phiên SSH sống [đóng]


240

Tôi sử dụng ssh -p8520 username@remote_hostđể đăng nhập máy chủ từ xa.

Vấn đề :

Nó luôn được kết nối và hoạt động đúng khi tôi ở nơi làm việc. Thật không may, thiết bị đầu cuối đóng băng trong 10 - 15 phút sau khi tôi kết nối với máy chủ từ xa.

Không có báo cáo lỗi / hết thời gian trên bảng điều khiển nhưng con trỏ không thể di chuyển được nữa.

Khi vào wđể kiểm tra người dùng đăng nhập, một số người dùng đăng nhập zombie đang ở đó và tôi phải giết chúng bằng tay.

Điều này khá khó chịu. Ai giúp tôi với?


Tôi đã có điều này quá, tôi bắt đầu sử dụng screen. Có lẽ đây là một vấn đề thời gian chờ.
martin

@martin screengiúp giữ cho chương trình chạy. Thật không may, đôi khi tôi phải làm việc trên máy chủ từ xa :(
Haifeng Zhang

Nếu bạn khởi động nó mà không có tham số, điều này cung cấp cho bạn một vỏ.
martin

Có phải bạn screenchỉ nói ? Nó có thể giải quyết vấn đề kết nối bị mất? Không screen -S screenName? Tôi luôn sử dụng màn hình với -S-r
Haifeng Zhang

1
Không, điều này không giải quyết được vấn đề, bạn chỉ tránh mất công trong thiết bị đầu cuối. Nếu bạn không làm gì, nó vẫn sẽ đóng băng, bạn chỉ có thể chọn nơi bạn bắt đầu. Tôi có nghĩa là bạn có thể tạo một thiết bị đầu cuối mà bạn luôn có thể tiếp tục bằng cách sử dụng screen. Có vẻ như bạn đã biết điều đó;)
martin

Câu trả lời:


448

Trình nền ssh (sshd), chạy phía máy chủ, sẽ đóng kết nối từ phía máy chủ nếu máy khách im lặng (nghĩa là không gửi thông tin). Để tránh mất kết nối, hãy hướng dẫn khách hàng ssh gửi tín hiệu đăng nhập đến máy chủ một lần.

Cấu hình cho cái này nằm trong tệp $HOME/.ssh/config, tạo tệp nếu nó không tồn tại (tệp cấu hình không được đọc trên thế giới, vì vậy hãy chạy chmod 600 ~/.ssh/configsau khi tạo tệp). Để gửi tín hiệu cứ sau bốn phút (240 giây) đến máy chủ từ xa, hãy đặt phần sau vào tệp cấu hình đó:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Để cho phép gửi tín hiệu duy trì cho tất cả các máy chủ, hãy đặt các nội dung sau vào tệp cấu hình:

Host *
    ServerAliveInterval 240

24
@ user271996, tại sao người ta phải khởi động lại một daemon cho cài đặt phía máy khách?
maxschlepzig

Cấu hình chỉ phải có thể ghi người dùng. khả năng đọc không phải là một mối quan tâm. Sử dụng 600 làm mức cho phép của bạn là tốt vì đó chỉ là người dùng có thể ghi.
jbruni

1
chỉ trong trường hợp không rõ ràng tệp cấu hình này nằm trong hộp PC / linux của bạn
zzapper

5
Tôi luôn bị nhầm lẫn về tên cấu hình: máy khách sử dụng ServerAliveInterval trong khi máy chủ sử dụng ClientAliveInterval . Thật là một mớ hỗn độn.
youkaichao

@youkaichao Thường có sự nhầm lẫn này. Là một nhà thiết kế API, có nhiều lý do mà tôi có thể đặt nó theo cả hai cách. Cuối cùng, điều quan trọng nhất, là tài liệu tốt về tiêu chuẩn được chọn.
Cameron Tacklind

170

Tôi muốn một giải pháp một lần:

ssh -o ServerAliveInterval=60 myname@myhost.com

Lưu trữ nó trong một bí danh:

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

Bây giờ có thể kết nối như thế này:

me@MyMachine:~$ sshprod

12
Điều đó thật tuyệt, nhưng không chính xác là "giải pháp một lần". Nếu bạn sẽ kết nối với máy chủ nhiều lần, tại sao không làm Host *& ServerAliveInterval 240(hoặc chỉ định tên máy chủ, nếu bạn chỉ muốn nó myname@myhost.comnhư trong câu trả lời của rockymonkey555? Đặt bí danh dường như không dễ dàng hơn bằng mọi cách.
Lambart

8
Hoặc, chỉ cần tạo bí danh trong ~ / .bashrc của bạn:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
Anh ta có nghĩa là "một lần" như trong "nó chỉ hoạt động một lần", không phải "tôi chỉ phải viết nó một lần".
Jonathan Hartley

1
Có, nếu bạn đọc "một lần" là "sử dụng một lần", thì công việc này hoàn hảo.
philraj

Nếu bạn muốn có một "one-liner" rằng bộ ServerAliveIntervalđến 60, tuyệt vời. Tuy nhiên, sử dụng bí danh bash khi bạn có thể đang sử dụng .ssh/configchỉ là ngớ ngẩn.
Cameron Tacklind

50

Đối với những người thắc mắc, @ edward-bờ biển

Nếu bạn muốn thiết lập chế độ lưu trữ cho máy chủ , hãy thêm phần này vào /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

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 (8) 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.

ClientAliveCountMax : Đặt số lượng tin nhắn còn sống của khách hàng (xem bên dưới) có thể được gửi mà không sshd (8) nhận lại bất kỳ tin nhắn nào từ máy khách. Nếu đạt đến ngưỡng này trong khi tin nhắn còn sống của khách hàng đang được gửi, sshd sẽ ngắt kết nối máy khách, chấm dứt phiên.


Dường như không có "tham số" nào như ClientAliveInterval, chỉ có ServerAliveInterval, bạn có thể kiểm tra trong trang hướng dẫn "man ssh_config"
dtj

6
Đó là một cái sai, hãy tìm trong "man sshd_config" cho phần máy chủ chạy ssh daemon, không phải cấu hình máy khách.
Jeff Davenport

Tôi nên sử dụng ClientAliveIntervalđể cho máy chủ kiểm tra máy khách còn sống hay tôi nên để máy khách "ping" máy chủ ServerAliveIntervalliên tục? Cả hai dường như không có ý nghĩa
qrtLs

1
Chỉ đặt ClientAliveIntervalmáy chủ nếu bạn muốn máy chủ ngắt kết nối trên các kết nối chết không phản hồi và bạn có thể tùy chỉnh tần suất và thời điểm xảy ra.
Jeff Davenport

19

cài đặt putty

Người dùng Putty FYI có thể thiết lập các tùy chọn ở đây


10

Chúng tôi có thể giữ kết nối ssh của mình bằng cách tuân theo các cấu hình Toàn cầu

Thêm dòng sau vào /etc/ssh/ssh_configtệp:

ServerAliveInterval 60

Điều đó chỉ làm việc cho khách hàng hay nó cũng hoạt động cho sshd?
Bờ biển Edward

1
@EdwardCoast Nó hoạt động trên máy khách. Tôi đã thử nghiệm nó trên Mac
minhas23
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.