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


283

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


8
Không có gì thực sự. Phiên bị gián đoạn và bảo mật của phiên bị xâm phạm. Nếu bạn không đặt máy tính vào chế độ ngủ, bạn có thể đặt thời gian duy trì để khách hàng bắn một nhịp tim còn sống vào máy chủ, nhưng nếu hệ thống sẽ ngủ thì không có gì có thể làm được.
darkdragn

3
Trong trường hợp này, tôi đang tìm kiếm thứ gì đó cho phép tôi khởi tạo 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

4
Bạn đã sai: Tôi có HAI máy khách để bàn kết nối với máy chủ SAME. Một là Ubuntu 12.10, Quantal, có máy khách SSH hoạt động tốt và giữ kết nối trong nhiều giờ. Cái khác là Ubuntu 14.10, không tưởng, bỏ qua cái khác và trong một bản cài đặt mới; Sau một vài phút, nó tự chặn thông báo 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 phải là sự cố mạng, cũng không phải sự cố máy chủ, mà là sự cố phần mềm SSH CLIENT cụ thể, có thể được giải quyết, ngược lại với điều "darkdragan" dám nói, "không thể làm gì được".
David L

2
Và thực sự, như tôi đã nói: mọi người nói quá nhiều khi họ nói "không thể làm gì được", giống như @darkdragn dám là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 đó [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 điều đó ở đây, và trong 20 phút cuối cùng, kết nối đã ổn định kể từ đó. Vì vậy, xin vui lòng, mọi người: hãy kiềm chế bản thân khi dám nghĩ rằng "không thể làm gì được" và kiềm chế hơn nữa khi cố gắng để lại tin nhắn đó cho người khác.
David L

11
@DavidL bạn nên đọc các câu hỏi tốt hơn trước khi đọc. Vấn đề của bạn không giống như của OP, người đề cập rõ ràng về việc đưa máy tính vào trạng thái ngủ. Mà nhân tiện chỉ có một trong những địa chỉ câu trả lời ("mosh"), và nó đã được đăng 2 năm sau 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 giải pháp cho các trường hợp có thể giải quyết dễ dàng hơn, như của bạn. Hãy bình tĩnh, đừng quá căng thẳng, hãy ca ngợi không làm gì tốt ở đây cả ...
msb

Câu trả lời:


266

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

Host *
ServerAliveInterval 120

Đây là tần suất, trong vài giây, nó sẽ gửi một thông điệp cố đị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 enter cứ sau hai phút khi bạn làm việc.

Bạn có thể đặt ServerAliveIntervaltrong /etc/ssh/ssh_configmáy khách hoặc ClientAliveIntervaltrong /etc/ssh/sshd_configmáy chủ. Hãy thử giảm khoảng thời gian nếu bạn vẫn nhận được lỗi.

Cấu hình cho một người dùng có thể được đặt trong tệp ~/.ssh/configcả ở phía máy chủ và máy khách. Hãy chắc chắn rằng tập tin có quyền chính xác chmod 644 ~/.ssh/config.


4
Tôi không dùng Mac, nhưng Ubuntu 12.04 và tệp cho hệ điều hành này dường như cũng là ~ / .ssh / config.
H2ONaCl

5
OS X 10.8.4 bị lỗiBad configuration option: ClientAliveInterval
ohho

3
Tôi gặp Bad configuration optionlỗi tương tự trên OSX 10.8.4.
Nick Heiner

10
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

2
Con khỉ của tôi nói với tôi: "Tại sao bạn không tự gõ" top [ENTER] "
augusto

85

Các phiên SSH có thể bị hỏng do nhiều lý do và có thể 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ẽ tồn tại độc lập với phiên ssh. Ví dụ: nếu bạn chạy screentrong một phiên ssh, bạn sẽ thấy một thiết bị đầu cuối mới mở và bạn có thể sử dụng nó để chạy các công việc. Hãy nói rằng phiên ssh của bạn chết trong quá trình. Chạy screen -dsau đó screen -rsẽ 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ó.


5
Đây có lẽ là câu trả lời tốt nhất, tôi không chắc tại sao nó không được bình chọn cao hơn. Các "cách khắc phục" khác rất hữu ích trong trường hợp đặc biệt khi 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 các 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 sẽ tiếp tục chạy, bất kể mọi vấn đề kết nối máy khách / máy chủ nào. .
Paul McMurdie

16
Tôi cũng sẽ thêm Tmux thay thế cho màn hình. Tôi thấy nó linh hoạt và ổn định hơn màn hình.
Thứ Sáu

2
chỉ để lại ở đây để tham khảo trong tương lai - bạn có thể thuận tiện chạy screen -d -rđể phục hồi phiên cuối cùng của mình.
doplumi

2
Hoặc đơn giản screen -dr. Hoặc screen -xtùy thuộc vào những gì bạn dự định làm. Vấn đề là, người ta phải biết tất cả những công tắc đó làm gì, để người ta có thể sử dụng những cái phù hợp và không chỉ mù quáng làm theo đề xuất của mọi người trên internet. Có một bản tóm tắt nhỏ gọn đẹp có sẵn ở đây: ss64.com/bash/screen.html
flith

Đây không phải là một câu trả lời cho vấn đề
user3728501

46

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

Hãy 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 nếu vấn đề của bạn đã được khắc phục. Tùy chọn ClientAliveInterval chỉ hữu ích khi định cấu hình máy chủ ssh (còn gọi là sshd), nó không thay đổi điều gì ở phía máy khách ssh, vì vậy đừ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 có gói tin nào được nhận trong 30 giây trước đó (như đã chỉ định ở trên). Tuy nhiên, nếu số tín hiệu hello-are-you-there liên tiếp đạt đến ServerAliveCountMax thì ssh sẽ ngắt kết nối vớ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ủ), hãy tăng nó nếu 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 chỉ giới hạn nó với một máy chủ cụ thể bằng cách thay thế dòng Host *bằng 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ủ hãy nhẹ nhàng với khách hàng của bạn. Các tập tin 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để 0hoặc tinh chỉnh ClientAliveIntervalClientAliveCountMaxthiết lập một không hoạt động ssh client tối đa mà không đáp ứng với các đầu dò. Một lợi thế của cài đặt này so với TCPKeepAlive là các tín hiệu được gửi qua các kênh được mã hóa, do đó ít có khả năng bị giả mạo.


Nó không hoạt động. Tôi đang phải đối mặt với cùng một lỗi một lần nữa.
dùng997704

3
Hãy thử trực tiếp từ dòng lệnh và đi xuống thấp hơn: ssh -o ServerAliveInterval = 5 user @ host
Matt

Đã thử điều đó quá..không làm việc. Tôi thực sự không biết điều gì đang xảy ra với hệ thống của mình
user997704

2
Đó là ClientAliveCountMax, KHÔNG 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.
CivilMeierFan

23

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 bản nâng cấp với thông báo "Viết không thành công. Đườ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 máy khách ssh:

TCPKeepAlive yes

trong

/etc/ssh/ssh_config

20

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Chỉ định xem hệ thống có nên gửi tin nhắn cố định TCP sang phía bên kia hay không. 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 chú ý chính xác. Tuy nhiên, điều này có nghĩa là các kết nối sẽ chết nếu tuyến tạm thời ngừng hoạt động và một số người cảm thấy phiền phức (Mặc định là 'có').

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 (1) 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 những 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_configthành:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax - Điều này cho biết tổng số tin nhắn kiểm tra đượ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ừ máy khách ssh. 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 tin nhắn cho khách hàng yêu cầu phản hồi. Deafult là 0 (máy chủ sẽ không gửi tin nhắn cho khách hàng để kiểm tra.).


Xem thêm: Các tùy chọn ServerAliveIntervalClientAliveIntervaltrong sshd_config làm gì, chính xác?


Đặt ServerAliveCountMax cao hơn mặc định trên máy khách cũng sẽ giúp giữ kết nối trực tiếp cho các kết nối chậm.
jonnyjandles

17

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ỏ 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à phản ứng nhanh 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.


6

Đối với tôi, tôi đã nhận được Write failed: Broken pipengay cả khi tôi đang tích cực gõ vim hoặc tại dấu nhắc shell. Tôi cũng không thể duyệt internet tại địa phương một lúc. (Tôi đã kết nối từ xa với Ubuntu bằng Terminal.)

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

Nếu bạn đã có kết nối quay số và đang truyền phát video hoặc nhạc với kết nối SSH hoặc telnet đồng thời, đôi khi bạn sẽ nhận được thông báo đường ống 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 gặp hơn.



3

Tôi có một tập lệnh trên máy chủ từ xa dường như không bao giờ bị lỗ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 dấu thời gian hiện tại trên máy chủ và giữ cho kết nối của bạn tồn tại miễn là kết nối không bị hủy 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.


9
hoặc đơn giản là topchạy đi
Eben Geer

1

Bạn có thể thêm các đối số này mỗi khi bạn gọi ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Bạn không phải chỉnh sửa tập tin / etc / ssh / * nếu bạn làm điều này.

Bạn có thể tạo một bí danh bash hoặc hàm hoặc tập lệnh để thực hiện điều này dễ dàng.

Ví dụ: các hàm bash này, bạn có thể thêm vào .bashrc của mình, do_ssh được sử dụng thủ công để bật thủ tục. do_ssh_pty được sử dụng trong các tập lệnh để đặt pty và tránh các lời nhắc.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

Bây giờ do_ssh user@hostcó thể được sử dụng hoặc thủ do_ssh user@host <args> <command>tục sẽ được kích hoạt.

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.