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 pipe
lỗ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 đó.
screen
?
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 pipe
lỗ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 đó.
screen
?
Câu trả lời:
Tôi đã thử điều này trong /etc/ssh/ssh_config
Linux 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 ServerAliveInterval
trong /etc/ssh/ssh_config
máy khách hoặc ClientAliveInterval
trong /etc/ssh/sshd_config
má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/config
cả ở 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
.
Bad configuration option: ClientAliveInterval
Bad configuration option
lỗi tương tự trên OSX 10.8.4.
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 screen
trong 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 -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ó.
screen -d -r
để phục hồi phiên cuối cùng của mình.
screen -dr
. Hoặc screen -x
tù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
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:
Để 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
để 0
hoặc tinh chỉnh ClientAliveInterval
và ClientAliveCountMax
thiế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.
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
Đố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_config
thà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 ServerAliveInterval
và ClientAliveInterval
trong sshd_config làm gì, chính xác?
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.
Đối với tôi, tôi đã nhận được Write failed: Broken pipe
ngay 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.
Tôi đã đăng câu trả lời của mình lên đây, vì nó không phải là máy ảo Ubuntu.
https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-top-rucky
ssh -o IPQoS=throughput user@host
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.
top
chạy đi
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@host
có thể được sử dụng hoặc thủ do_ssh user@host <args> <command>
tục sẽ được kích hoạt.