Câu hỏi Làm thế nào để ngăn chặn "Viết không thành công: đường ống bị hỏng" trên kết nối SSH?


Tôi có thể làm gì để định cấu hình SSH trên cả máy khách và máy chủ để ngăn chặn Write Failed: broken pipe lỗi? Nó thường xảy ra nếu bạn ngủ máy tính khách của bạn và tiếp tục sau này.


232
2018-04-28 23:36


gốc


Không có gì thực sự. Phiên bị gián đoạn, và sự an toàn của phiên đã bị xâm phạm. Nếu bạn không đặt comp vào giấc ngủ, bạn có thể đặt thời gian sống động để khách hàng quay nhịp tim còn sống cho máy chủ, nhưng nếu hệ thống ngủ thì không có gì có thể làm được. - darkdragn
Trong trường hợp này, tôi đang tìm kiếm thứ gì đó sẽ cho phép tôi bắt đầu lại kết nối ssh bị hỏng (có thể dựa trên mã thoát) và khôi phục bằng cách sử dụng screen? - sorin
Bạn là người sai: Tôi có HAI máy khách trên máy tính để bàn kết nối với máy chủ SAME. Một là ubuntu 12.10, Quantal, có trình khách SSH hoạt động tốt và giữ kết nối trong nhiều giờ. Cái còn lại là Ubuntu 14.10, Utopic, chỉ cần sang một bên khác và trong một cài đặt mới; sau một vài phút, nó tự khóa chính nó với thông điệp này. Phần còn lại của các chức năng mạng trong máy không bị gián đoạn. Vì vậy, không, nó không phải là một vấn đề mạng, cũng không phải là một vấn đề máy chủ, nhưng một vấn đề phần mềm SSH CLIENT cụ thể, mà có thể được giải quyết, đối diện với những gì "darkdragan" dám nói, rằng "không có gì có thể được thực hiện". - David L
Và thực sự, như tôi đã nói: mọi người nói quá nhiều khi họ nói "không có gì có thể được thực hiện", giống như @darkdragn dám. Tôi đọc câu trả lời của Aram Kocharyan, và tôi đã áp dụng nó: 20 phút trước ... Tôi nhận ra rằng trong Ubuntu 12.10 cũ của tôi, tôi đã áp dụng hướng dẫn đó trong tập tin [Tôi vừa kiểm tra], hai năm trước, và đó là lý do của sự ổn định ở đó. Tôi đã làm nó ở đây, và trong 20 phút cuối, kết nối đã ổn định kể từ đó. Vì vậy, xin vui lòng, mọi người: kiềm chế bản thân khi dám nghĩ rằng "không có gì có thể được thực hiện", và kiềm chế nhiều hơn khi cố gắng để lại tin nhắn đó cho người khác. - David L
@DavidL bạn nên đọc các câu hỏi tốt hơn trước khi ranting. Vấn đề của bạn không giống như vấn đề của OP, người đề cập rõ ràng việc đưa máy tính vào trạng thái ngủ. Mà bằng cách này chỉ có một trong những địa chỉ câu trả lời ("mosh"), và nó đã được đăng 2 năm sau khi câu hỏi. Tuy nhiên các câu trả lời khác làm điều tốt nhất tiếp theo, đó là đề xuất các giải pháp cho các trường hợp có thể được giải quyết dễ dàng hơn, giống như của bạn. Ơn, đừng căng thẳng, ranting không làm gì tốt ở đây ... - msb


Các câu trả lời:


Tôi đã thử điều này trong /etc/ssh/ssh_config cho Linux và Mac:

Host *
ServerAliveInterval 120

Đây là mức độ thường xuyên, tính bằng giây, nó sẽ gửi một thông điệp dự tính đến máy chủ. Nếu điều đó không hiệu quả thì hãy huấn luyện một con khỉ để nhấn cứ hai phút một lần trong khi bạn làm việc.

Bạn có thể đặt ServerAliveInterval trong /etc/ssh/ssh_config của máy khách hoặc ClientAliveInterval trong /etc/ssh/sshd_config của máy chủ. Hãy thử giảm khoảng thời gian nếu bạn vẫn gặp lỗi.

Cấu hình cho một người dùng có thể được đặt trong tệp ~/.ssh/config cả trên máy chủ và phía máy khách. Đảm bảo tệp có quyền chính xác chmod 644 ~/.ssh/config.


211
2018-05-26 11:49



Vâng tôi làm tương tự và nó hoạt động khá tốt cho hầu hết mọi thứ. - Oli♦
Tôi không có trên máy Mac, nhưng Ubuntu 12.04 và tệp cho hệ điều hành này cũng có vẻ là ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 đưa ra lỗi Bad configuration option: ClientAliveInterval - ohho
Tôi cũng vậy Bad configuration option lỗi trên OSX 10.8.4. - Nick Heiner
Nói chung, bạn đặt hai lệnh này vào các phần khác nhau của hệ thống. Chỉ ServerAliveInterval ở phía máy khách OSX ... và chỉ ClientAliveInterval trên tệp cấu hình sshd ... - ftrotter


Phiên SSH có thể bị hỏng do nhiều lý do không thể tránh khỏi.

Một tiện ích hữu ích có thể được sử dụng để giảm thiểu các vấn đề gây ra bởi điều này được gọi là screen. Màn hình là một tiện ích mạnh mẽ cho phép bạn kiểm soát nhiều thiết bị đầu cuối sẽ vẫn hoạt động độc lập với phiên ssh. Ví dụ, nếu bạn chạy screen trong một phiên ssh bạn sẽ thấy một terminal mới mở và bạn có thể sử dụng nó để chạy các công việc. Cho phép nói phiên ssh của bạn chết trong quá trình này. Đang chạy screen -d sau đó screen -r sẽ mở lại phiên cuối cùng và bạn sẽ có thể tiếp tục từ đó. Hãy chắc chắn rằng bạn đọc một số tài liệu trước khi sử dụng nó.


70
2017-10-04 16:28



Đây có lẽ là câu trả lời hay nhất, tôi không chắc tại sao nó không được bình chọn cao hơn. Các "bản sửa lỗi" khác hữu ích trong trường hợp đặc biệt mà bạn thực sự quan tâm đến việc duy trì kết nối SSH, nhưng trong hầu hết trường hợp sử dụng, tôi tưởng tượng mối quan tâm thực sự là các quy trình dự định tiếp tục chạy, bất kể vấn đề kết nối máy khách / máy chủ nào . - Paul McMurdie
Tôi cũng sẽ thêm Tmux thay thế cho màn hình. Tôi thấy nó linh hoạt hơn và ổn định hơn màn hình. - fridaymeetssunday
chỉ cần rời khỏi đây để tham khảo trong tương lai - bạn có thể thuận tiện chạy screen -d -r để khôi phục phiên cuối cùng của bạn. - doplumi
Hoặc đơn giản screen -dr. Hoặc là screen -x tùy thuộc vào những gì bạn định làm. Vấn đề là, người ta phải biết những gì tất cả các thiết bị chuyển mạch làm, để người ta có thể sử dụng những người thích hợp và không chỉ mù quáng theo gợi ý của người dân internet. Có một bản tóm tắt ngắn gọn có sẵn ở đây: ss64.com/bash/screen.html - flith


Cấu hình máy khách

Thử tạo tệp:

~/.ssh/config

Thêm nội dung:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Bây giờ ssh đến máy chủ của bạn và xem liệu sự cố của bạn có được khắc phục hay không. Tùy chọn ClientAliveInterval chỉ hữu dụng khi cấu hình máy chủ ssh (aka sshd), nó không thay đổi một điều gì ở phía máy khách ssh, do đó, không sử dụng nó trong tệp cấu hình ở trên.

Điều này sẽ gửi tín hiệu hello-are-you-there đến máy chủ nếu không nhận được gói nào trong 30 giây trước đó (như được chỉ định ở trên). Tuy nhiên, nếu số lượng tín hiệu hello-are-you-there liên tiếp đến ServerAliveCountMax thì ssh sẽ ngắt kết nối khỏi máy chủ. Giá trị này được mặc định là 3 (vì vậy 3 * 30 = 90 giây không có hoạt động của máy chủ), tăng giá trị nếu nó phù hợp với nhu cầu của bạn. Có rất nhiều tùy chọn cấu hình cho tệp .ssh / config và bạn có thể đọc:

Sử dụng tệp cấu hình SSH

Để biết thêm thông tin về các tùy chọn khác. Bạn có thể không muốn áp dụng điều này cho mọi máy chủ mà bạn kết nối với ví dụ này. Hoặc hạn chế nó chỉ với một máy chủ cụ thể bằng cách thay thế dòng Host * với Host <IP> (thay thế bằng địa chỉ IP, xem trang man ssh_config).

Cấu hình máy chủ

Tương tự như vậy bạn có thể nói với máy chủ để được nhẹ nhàng với khách hàng của bạn. Tệp cấu hình là /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Bạn có thể tắt nó bằng cách thiết lập ClientAliveInterval đến 0 hoặc tinh chỉnh ClientAliveInterval và ClientAliveCountMax để thiết lập một khách hàng ssh tối đa không hoạt động mà không trả lời các đầu dò. Một lợi thế của các thiết lập này trên TCPKeepAlive là các tín hiệu được gửi qua các kênh được mã hóa, vì vậy nó ít có khả năng trở nên giả mạo hơn.


40
2017-10-06 02:54



Nó không hoạt động. Tôi đang đối mặt với cùng một lỗi một lần nữa. - user997704
Hãy thử nó ngay từ dòng lệnh và xuống thấp hơn: ssh -o ServerAliveInterval = 5 user @ host - Matt
Đã cố gắng quá .. không hoạt động. Tôi thực sự không biết chuyện gì đang diễn ra với hệ thống của mình - user997704
Đó là ClientAliveCountMax, NOT ClientAliveMaxCount - David G
@DavidG Vui lòng chỉnh sửa câu trả lời với các chỉnh sửa của bạn. - CivMeierFan


Tôi đang nâng cấp từ xa một máy chủ Ubuntu từ sáng suốt đến chính xác và mất kết nối ssh ở giữa quá trình nâng cấp với thông báo "Viết không thành công. Ống Brocken". ClientAliveInterval và ServerAliveInterval không làm gì cả. Giải pháp là bật tùy chọn TCPKeepAlive trong ssh của khách hàng:

TCPKeepAlive yes

trong

/etc/ssh/ssh_config

22
2017-10-07 18:40





Đối với khách hàng, hãy chỉnh sửa ~/.ssh/config (hoặc là /etc/ssh/ssh_config) tệp như sau:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Chỉ định liệu hệ thống có nên gửi TCP keepalive hay không   tin nhắn cho phía bên kia. Nếu chúng được gửi đi, cái chết của kết nối   hoặc sự cố của một trong các máy sẽ được nhận thấy đúng. Tuy nhiên,   điều này có nghĩa là các kết nối sẽ chết nếu tuyến đường tạm thời ngừng hoạt động,   và một số người cảm thấy khó chịu (mặc định là 'có').

ServerAliveInterval - Đặt khoảng thời gian chờ trong vài giây sau đó   nếu không có dữ liệu nào được nhận từ máy chủ, ssh (1) sẽ gửi   thông báo qua kênh được mã hóa để yêu cầu phản hồi từ   máy chủ. Giá trị 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ủ.


Đối với máy chủ, hãy chỉnh sửa /etc/ssh/sshd_config như:

ClientAliveInterval 600
ClientAliveCountMax 0

Nếu bạn muốn ssh client tự động thoát (hết thời gian chờ) sau 10 phút (600 giây).

ClientAliveCountMax - Điều này cho biết tổng số kiểm tra   thư được gửi bởi máy chủ ssh mà không nhận được bất kỳ phản hồi nào từ   ssh khách hàng. Mặc định là 3.

ClientAliveInterval - Điều này cho biết thời gian chờ tính bằng giây. Sau x   số giây, máy chủ ssh sẽ gửi một tin nhắn cho khách hàng hỏi   để trả lời. Deafult là 0 (máy chủ sẽ không gửi tin nhắn cho khách hàng đến   kiểm tra.).


Xem thêm: Các tùy chọn ServerAliveInterval và ClientAliveInterval trong sshd_config làm, chính xác?


18
2017-10-02 13:52





Tôi hoàn toàn yêu Mosh. Tôi thường xuyên ssh vào một máy chủ, đóng máy tính xách tay của tôi và đi đến một quán cà phê, mở nó lên và tiếp tục như thể không có gì thay đổi.

Mosh (vỏ điện thoại di động)

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

Mosh là sự thay thế cho SSH. Nó mạnh mẽ hơn và đáp ứng,   đặc biệt là qua các kết nối 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.


16
2017-09-30 18:48





Đối với tôi, tôi đã nhận được Write failed: Broken pipe ngay cả khi tôi đã tích cực gõ vào vim hoặc tại dấu nhắc trình bao. Tôi cũng không thể duyệt Internet cục bộ. (Tôi đã kết nối từ xa với Ubuntu bằng cách sử dụng Terminal.)

Những người khác trong mạng của tôi phát trực tuyến rất nhiều video từ Netflix và các địa điểm khác. Tôi không thể chứng minh nó, nhưng tôi nghi ngờ nó là một vấn đề ISP hoặc router. Ví dụ: Verizon và Netflix đang chỉ ngón tay vào nhau vì các sự cố mạng của khách hàng của họ.

Nếu bạn đã có kết nối quay số và đang phát trực tuyến video hoặc nhạc bằng kết nối SSH hoặc telnet đồng thời, điều đó là không thể tránh khỏi tại một thời điểm nào đó bạn sẽ nhận được thông báo lỗi bị hỏng. Nâng cấp gói băng thông rộng ISP của tôi dường như làm cho kết nối bị hỏng của tôi ít thường xuyên hơn.


4
2017-07-30 13:33





Tôi có một kịch bản trên máy chủ từ xa không bao giờ có vẻ thất bại, bất kể máy khách hoặc máy chủ cấu hình SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Lưu nó vào một số tập tin dummy.sh và nhanh chóng chạy nó trước khi bạn thu nhỏ cửa sổ hoặc di chuyển ra khỏi nó. Nó sẽ tiếp tục in tem thời gian hiện tại trên máy chủ và giữ cho kết nối của bạn còn sống miễn là kết nối không bị ngắt bởi bất kỳ lý do nào khác. Khi bạn quay lại thiết bị đầu cuối đó, chỉ cần nhấn CTRL + C và tiếp tục làm việc.


3
2017-09-09 16:50



hoặc đơn giản là rời đi top đang chạy - Eben Geer