Làm thế nào để kết nối lại với một phiên ssh bị ngắt kết nối


157

Có cách nào để kết nối với một phiên ssh bị ngắt kết nối không? Chúng tôi đang gặp sự cố với kết nối mạng của mình đến một trang web từ xa mà chúng tôi đang làm việc riêng; tuy nhiên, trong thời gian đó, chúng tôi gặp phải một số lượng lớn các ngắt kết nối do các gói bị mất trong khi kết nối với các máy chủ tại địa điểm từ xa. Nhiều lần phiên vẫn hoạt động trong một thời gian và đôi khi nó xảy ra ở giữa một số hành động (chỉnh sửa tệp, chạy một số quy trình, v.v.) mà tôi cần quay lại thay vì khởi động lại nếu có thể.


10
Tôi không thể tin rằng không ai nhắc đến mosh.mit.edu
jwbensley

@javano: Tôi chưa bao giờ nghe nói về nó. Thêm vào đó như một câu trả lời!
kbyrd 23/11/13

@kbyrd Đã làm xong;)
jwbensley

một câu hỏi tương tự đã được hỏi trong unix.stackexchange.com/questions/105001/, với một số gợi ý về cách khắc phục sự cố ngắt kết nối ở nơi đầu tiên ...
anarcat

Câu trả lời:


136

CẬP NHẬT: Để có câu trả lời thực tế, hãy xem câu trả lời của zero_r bên dưới

Đây không phải là một câu trả lời, nhưng một cách giải quyết. Sử dụng màn hình .

Khi bạn đăng nhập lần đầu, hãy chạy màn hình. Bạn nhận được một shell khác, chạy các lệnh trong đó. Nếu bạn bị ngắt kết nối, quy trình màn hình sẽ giữ cho thiết bị đầu cuối tồn tại để vỏ của bạn và các quy trình mà nó đang chạy không bị đổ. Khi bạn kết nối lại, hãy chạy 'screen -r' để tiếp tục.

Có rất nhiều thứ để cấu hình và sử dụng màn hình, nhưng những điều trên sẽ giải quyết vấn đề của bạn.


18
Hoặc sử dụng tmux - màn hình 'mát' hơn, tôi đã sử dụng cả hai và thích tmux hơn vì bạn có thể phân chia thuật ngữ độc đáo.
John Hunt

3
Tôi rất vui khi thấy screenđã được cài đặt trên Ubuntu 12.x của mình, vì vậy nếu bạn không chắc chắn chỉ cần thử lệnh này, nó đã kết nối lại và tiếp tục quá trình nâng cấp do phát hành : sudo screen -D -r
bjm88

1
@ bjm88, sudochỉ nên được sử dụng nếu phiên màn hình gốc được bắt đầu bằng sudo. Nếu không, nó sẽ trở lại như thể không có phiên màn hình nào tồn tại:There is no screen to be detached
Noam Manos

+1 Tôi nhận ra đây không phải là câu trả lời thực tế; tuy nhiên, screen -rđó chính xác là những gì tôi đang tìm kiếm.
Eric Nelson

130

Cố gắng đặt ClientAliveInterval (ví dụ 60) và TCPKeepAlive (có hoặc không) thành các giá trị phù hợp trên sshd.conf bên máy chủ.

Điều này sẽ giữ cho phiên của bạn tồn tại ngay cả khi kết nối bị mất trong vài phút.


24
Cho đến nay, bạn dường như là người duy nhất thực sự trả lời câu hỏi thay vì đề xuất màn hình như một cách giải quyết.
kbyrd

2
Cuộc gọi tốt Chúng tôi đã tìm thấy phương pháp này rất hữu ích khi đi qua tường lửa cisco ASA / PIX, theo mặc định, tình yêu hết thời gian kết nối tcp.
Mike Pountney

5
Có lẽ đây không phải là nơi thích hợp để hỏi, nhưng liệu người đăng có thể chuyển câu trả lời không? Chúng ta nên trả lời 'màn hình' (của tôi không phải là tốt nhất, tôi thích câu trả lời của Mike Pountney, nhưng tôi đã có đại diện) với thông tin này.
kbyrd

1
Điều này có hoạt động khi được kết nối qua kết nối VPN của Cisco và kết nối VPN bị mất và được thiết lập lại không?
Brent

Đối với tôi màn hình hoạt động hoàn hảo, tôi có thể kết nối lại với nhiệm vụ được sàng lọc và tính toán để hoạt động
tích

65

Như đã đề cập ở trên, GNU Screen là con đường để đi. Nó sẽ cho phép bạn có một 'phiên màn hình' trên hộp từ xa để bạn có thể chạy nhiều lệnh trong, thông qua nhiều 'cửa sổ màn hình'. Điều này chỉ đơn giản là tách ra nếu kết nối SSH cha của bạn chết, giữ cho tất cả các quy trình con hoạt động trong đó vẫn hoạt động tốt.

' man screen' là bạn của bạn như bình thường và gói hệ điều hành nên được gọi là ' screen' nếu nó không được cài đặt theo mặc định.

Khái niệm cơ bản là:

  • Bắt đầu một phiên màn hình (trên máy chủ từ xa của bạn):

    $ screen
    
  • Ngắt kết nối khỏi phiên màn hình của bạn : CTRL-A,d

  • Kết nối lại với phiên màn hình của bạn sau khi đăng nhập lại:

    $ screen -d -r
    
  • Mở thêm một 'cửa sổ' màn hình: CTRL-A,c

  • Chu kỳ thông qua bạn cửa sổ màn hình mở: CTRL-A,space

rất nhiều thứ hay ho bạn có thể làm với Screen. Tôi đã sử dụng nó hơn 10 năm và vẫn đang tìm hiểu các tính năng mới. Đây là tiện ích Unix yêu thích của tôi.


1
Vâng, đây là một câu trả lời tốt hơn nhiều so với của tôi.
kbyrd

Tôi vẫn có thể kết nối với phiên ssh bị ngắt kết nối, nếu tôi khởi động lại máy tính của mình nơi màn hình đang chạy?
BarathVutukuri

tmux mạnh hơn
Pegasus

46

Tôi không thể tin rằng không ai đã đề cập đến MOSH ;

Mosh là một giao thức riêng biệt có thể nối vào quá trình đăng nhập SSH, nó giữ cho phiên của bạn tồn tại sau nhiều ngày bị ngắt kết nối, thay đổi IP, độ trễ cao, v.v. Nó được giải thích trên trang chủ tốt hơn tôi có thể giải thích nó vì vậy tôi đã sao chép mô tả dưới đây. Kinh nghiệm và lời khuyên của tôi là tôi sử dụng nó trên điện thoại di động Android của mình, đó là một trình bảo vệ cuộc sống khi đi du lịch và SSH. Điều tương tự cũng đúng trên máy tính xách tay của tôi khi kết nối với điện thoại di động trên tàu chẳng hạn. Tôi khuyên bạn nên biên dịch từ nguồn để có phiên bản mới nhất, phiên bản repo cho tôi bên trong Ubuntu có một vài phiền toái trong đó được khắc phục trong phiên bản mới nhất (tại thời điểm viết).

Mosh (vỏ di động)

Ứng dụng thiết bị đầu cuối từ xa cho phép chuyển vùng, hỗ trợ kết nối không liên tục và cung cấp tiếng vang thông minh cục bộ và chỉnh sửa dòng phím của người dùng.

Mosh là một sự thay thế cho SSH. Nó mạnh mẽ và nhạy bén hơn, đặc biệt là qua các liên kết Wi-Fi, di động và đường dài.

Mosh là phần mềm miễn phí, có sẵn cho GNU / Linux, FreeBSD, Solaris, Mac OS X và Android.

Các tính năng từ trang web:

  • Thay đổi IP. Luôn kết nối : Mosh tự động chuyển vùng khi bạn di chuyển giữa các kết nối Internet. Sử dụng Wi-Fi trên tàu, Ethernet trong khách sạn và LTE trên bãi biển: bạn sẽ đăng nhập. Hầu hết các chương trình mạng đều mất kết nối sau khi chuyển vùng, bao gồm cả ứng dụng SSH và Web như Gmail. Mosh thì khác.

  • Làm cho những giấc mơ ngọt ngào : Với Mosh, bạn có thể đặt máy tính xách tay của bạn ngủ và đánh thức nó sau, giữ cho kết nối của bạn nguyên vẹn. Nếu kết nối Internet của bạn bị rớt, Mosh sẽ cảnh báo bạn - nhưng kết nối sẽ hoạt động trở lại khi dịch vụ mạng hoạt động trở lại.

  • Loại bỏ độ trễ của mạng : SSH chờ phản hồi của máy chủ trước khi hiển thị cho bạn cách gõ của riêng bạn. Điều đó có thể làm cho một giao diện người dùng tệ hại. Mosh thì khác: nó cung cấp phản hồi tức thì cho việc gõ, xóa và chỉnh sửa dòng. Nó thực hiện điều này một cách thích ứng và hoạt động ngay cả trong các chương trình toàn màn hình như emacs và vim. Trên một kết nối xấu, các dự đoán nổi bật được gạch chân để bạn sẽ không bị nhầm lẫn.

  • Không có mã đặc quyền. Không có daemon : Bạn không cần phải là siêu người dùng để cài đặt hoặc chạy Mosh. Máy khách và máy chủ là các tệp thực thi được chạy bởi một người dùng thông thường và chỉ tồn tại trong vòng đời của kết nối.

  • Phương thức đăng nhập tương tự : Mosh không nghe trên các cổng mạng hoặc xác thực người dùng. Máy khách mosh đăng nhập vào máy chủ thông qua SSH và người dùng trình bày cùng thông tin đăng nhập (ví dụ: mật khẩu, khóa chung) như trước đây. Sau đó Mosh chạy máy chủ mosh từ xa và kết nối với nó qua UDP.

  • Chạy bên trong thiết bị đầu cuối của bạn, nhưng tốt hơn : Mosh là một chương trình dòng lệnh, như ssh. Bạn có thể sử dụng nó bên trong xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen hoặc tmux. Nhưng mosh được thiết kế từ đầu và chỉ hỗ trợ một bộ ký tự: UTF-8. Nó sửa các lỗi Unicode trong các thiết bị đầu cuối khác và trong SSH.

  • Control-C hoạt động rất tốt : Không giống như SSH, giao thức dựa trên UDP của mosh xử lý mất gói một cách duyên dáng và đặt tốc độ khung hình dựa trên các điều kiện mạng. Mosh không lấp đầy bộ đệm mạng, vì vậy Control-C
    luôn hoạt động để ngăn chặn quá trình chạy trốn.


8
Mosh không phải là một trình bao bọc ssh - nó là một giao thức khác, hầu như không liên quan đến ssh (nó chỉ sử dụng ssh để đăng nhập).
JCH

+1 Rất đúng, lỗi của tôi.
jwbensley

2
Thế còn an ninh, người đàn ông ở giữa? mã hóa? trao đổi chìa khóa?
Nasir Iqbal

Mosh trông awesome, mặc dù buồn bã không hỗ trợ cổng chuyển tiếp chưa .
Boann

20

autossh xem kết nối của bạn và nếu nó bị hỏng, nó sẽ kết nối lại. Nó đáng tin cậy hơn thủ tục. Nếu bạn kết nối với phiên màn hình, bạn sẽ tiếp tục ngay từ nơi bạn bị ngắt kết nối (xem rscreenđiều đó đi kèm với tự động)


1
bên ngoài cấu hình duy trì, nó không cho phép bạn kết nối lại với một phiên (điều mà OP đang tìm kiếm). nhưng autossh có thể thực sự hữu ích cho các ứng dụng yêu cầu đường hầm ssh, ánh xạ cổng, v.v.
ives

có autossh + màn hình sẽ là điểm ngọt ngào. autossh có rscreencho điều này.
hayalci

Autossh tốt hơn mosh. Tôi đã sử dụng cả hai.
Sridhar Sarnobat

Đây là một bài đăng trên blog của Jesse Keat , về việc sử dụng autossh với màn hình .
sampablokuper

12

tmux

Điều này là một cổ điển. Sử dụng nó bất cứ khi nào bạn có nguy cơ mất kết nối với thiết bị đầu cuối.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Cứ như vậy, bạn sẽ hoạt động trở lại.


Cảm ơn rất nhiều! Tôi đang tìm cách làm điều này với tmux, vì đó dường như là điều mà hầu hết mọi người coi là lựa chọn tốt hơn.
CoolOppo

10

Tôi sẽ cài đặt và bắt đầu màn hình để khắc phục vấn đề của bạn. Màn hình sẽ cho phép bạn kết nối lại với phiên màn hình trước đó.

Ngoài ra, màn hình cũng cho phép bạn làm những việc hay ho như chia đôi màn hình, xem bảng điều khiển, v.v. Bạn có thể tìm thêm thông tin ở đâyđây .

Để bắt đầu, nếu bạn bị ngắt kết nối, bạn có thể sử dụng

screen -ls

để xem các phiên của bạn và

screen -r ${session} 

để kết nối lại với một người bị ngắt kết nối.


4

Như những người khác đã chỉ ra, màn hình nói chung là giải pháp tốt nhất cho việc này và nó cũng bổ sung một loạt các tính năng hữu ích khác.

Bạn có thể thiết lập hồ sơ của mình trên máy từ xa để tự động khởi động và / hoặc kết nối lại với màn hình khi đăng nhập, điều này giúp bạn quên việc bắt đầu màn hình một lần bạn cần vì bạn bị mất kết nối.

Xem http://tlug.dnho.net/?q=node/239 (hoặc tìm kiếm Google cho nhiều ví dụ khác có các cách hơi khác nhau).


3

một sự thay thế hiện đại hơn cho màn hình, tuy nhiên không có sẵn cho một số loại "ảo hóa" (ví dụ: trong cygwin bạn có thể có "màn hình", nhưng không phải là "tmux" do cách thiết kế của nó), nhưng bất cứ nơi nào bạn có tùy chọn để cài đặt tmux , Tôi thực sự khuyên bạn nên sử dụng màn hình đó.


3

Đây là một giải pháp phi màn hình khác.

Khay putty cho phép bạn làm điều đó, nó có kết nối lại tùy chọn ngắt kết nối không thường xuyên hoặc putty-ng

https://puttytray.goeswhere.com/

đó là một nhánh của putty (nguồn mở hoàn toàn) với các tùy chọn khác, đi đến cài đặt kết nối và có 2 tùy chọn, một cho 'cố gắng kết nối lại khi không kết nối' và 'cố gắng kết nối lại khi khởi động'.


1
Ơ Liệu nó có đi kèm với một keylogger và một tiện ích exfiltration ppk tự động, bất cứ khi nào?
Deer Hunter

1
Tôi giả sử bạn đang hỏi nếu bằng cách nào đó, đánh cắp thông tin của bạn, nó hoàn toàn là nguồn mở, mã nguồn có sẵn trên github nếu bạn muốn xem github.com/FauxFaux/PuTTYTray có khá nhiều người đóng góp: )
munkiepus

chúc mừng lớn :)
munkiepus

2

Mặc dù màn hình sẽ giữ phiên shell của bạn mở trên máy chủ từ xa nếu phiên ssh của bạn giảm, nhưng nó sẽ không làm gì về vấn đề kết nối ssh bị hủy. Như zero_r gợi ý, hãy thử điều chỉnh kết nối ssh của bạn với việc giữ liên lạc và thời gian chờ lâu.

Tôi đề nghị bạn theo dõi nguyên nhân của các gói bị mất gây ra sự cố và khắc phục thay vì xử lý xung quanh nó.


Cám ơn vì sự gợi ý. Chúng tôi đang cố gắng theo dõi vấn đề gốc của việc mất gói, đơn giản chỉ cần một chút thời gian để tìm ra nó (rất khó, cái này!). Đây thực sự là một cách giải quyết cho giai đoạn rắc rối này. Người ta không bao giờ biết khi nào một cái gì đó sẽ gây ra một kết nối bị mất.
nhợt nhạt

1
Nó sẽ tạo ra rất nhiều tiếng ồn, nhưng bạn có thể thử chạy ssh qua strace và xem những gì nó làm / báo cáo khi kết nối ssh giảm. Nó có thể chỉ báo cáo những gì bạn đã biết, nhưng ai biết ...
David

1

Đôi khi tôi quên chạy màn hình quá và mất công việc còn dang dở. Trong trường hợp này, mặc dù chúng tôi không thể gắn lại phiên SSH bị hỏng, việc sửa lại chương trình đang chạy sang thiết bị đầu cuối mới và tiếp tục lại những gì bạn đang làm vẫn có thể nhờ vào reptyr.

Sau khi vô tình ngắt kết nối với phiên SSH, điều đầu tiên trước tiên là chạy screenvì sợ kết nối bị hỏng lần nữa. Sau đó, trong phiên mới, hãy chạy ps aux | grep {The process to be resumed}để có được PID. Với PID, bạn có thể thử reptyr {PID}hoặc reptyr -T {PID}(nếu có các quy trình con) để tiếp tục công việc.

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.