SSH bağlantısında “Yazma Başarısız Oldu: Bozuk Boru” Nasıl Önlenir?


283

Write Failed: broken pipeHataları önlemek için hem istemci hem de sunucularda SSH'yi yapılandırmak için ne yapabilirim ? İstemci bilgisayarınızı uyursanız ve daha sonra devam ederseniz, genellikle oluşur.


8
Gerçekten hiçbir şey. Oturum kesintiye uğradı ve oturumun güvenliği tehlikeye atıldı. Bilgisayarı uykuya yatırmazsanız, istemcinin sunucuya kalp atışını canlı tutması için müşterinin hayatta kalması için bir süre ayarlayabilirsiniz, ancak sistem uyuyacaksa o zaman yapılabilecek hiçbir şey yoktur.
darkdragn

3
Bu durumda bana (çıkış koduna muhtemelen alınarak) kırık SSH bağlantısı yeniden başlatmak ve kullanarak geri sağlayacak bir şey arıyorum screen?
sorin

4
Siz yanlışsınız: SAME sunucusuna bağlanan İKİ masaüstü istemci makinem var. Biri SSH müşterisi iyi çalışan ve bağlantıyı saatlerce koruyan ubuntu 12.10, Quantal. Diğeri Ubuntu 14.10, Utopic, diğeri kenara ve yeni bir kurulumla; Birkaç dakika sonra bu mesajla kendisini engeller. Makinedeki ağ işlevlerinin geri kalanı kesintiye uğramaz. Yani hayır, ne bir ağ sorunu, ne de bir sunucu problemi değil, "darkdragan" ın "hiçbir şey yapılamayacağını" söylemeye cüret ettiği şeyin tersine, çözülebilecek bir SSH CLIENT yazılım problemi.
David L,

2
Gerçekten de dediğim gibi: insanlar "hiçbir şey yapılamaz" dediklerinde, @darkdragn'ın cüret ettiği gibi, çok konuşurlar. Aram Kocharyan'ın cevabını okudum ve uyguladım: 20 dakika önce ... Eski Quantal Ubuntu 12.10'da, bu talimatı iki yıl önce bu dosyaya [daha önce kontrol ettim] uyguladığımı fark ettim. orada istikrarın nedeni. Burada yaptım ve bu son 20 dakika içinde, bağlantı o zamandan beri kararlıydı. Öyleyse lütfen, insanlar: “hiçbir şeyin yapılamayacağını” düşünmeye cesaret ederken kendinizden kaçının ve bu mesajı diğer insanlara bırakmaya çalışırken daha fazla kaçının.
David L,

11
@DavidL sen zıplamadan önce soruları daha iyi okumalısın. Sorununuz, bilgisayarı uyku moduna geçirmekten açıkça bahseden OP'ler ile aynı değil. Bu arada cevaplardan sadece bir tanesi ("mosh") ve sorudan 2 yıl sonra gönderildi. Bununla birlikte, diğer cevaplar bir sonraki en iyi şeyi yapar; bu da sizinki gibi daha kolay çözülebilen davalara çözümler önerir. Sakin ol, çok stresli olma, ranting buralarda hiçbir işe yaramaz ...
msb

Yanıtlar:


266

Bunu /etc/ssh/ssh_configLinux ve Mac için denedim :

Host *
ServerAliveInterval 120

Bu ne kadar sıklıkla, saniyeler içinde sunucuya sürekli bir mesaj göndermelidir. Bu işe yaramazsa, çalışırken her iki dakikada bir enter tuşuna basın.

Ya ayarlayabilirsiniz ServerAliveIntervaliçinde /etc/ssh/ssh_configistemci makinenin veya ClientAliveIntervaliçinde /etc/ssh/sshd_configsunucu makinenin. Hâlâ hatayı alıyorsanız aralığı azaltmayı deneyin.

Tek bir kullanıcı için konfigürasyon ~/.ssh/confighem sunucu hem de müşteri tarafında dosyada ayarlanabilir . Dosyanın doğru izinlere sahip olduğundan emin olun chmod 644 ~/.ssh/config.


4
Mac'te değilim, ancak Ubuntu 12.04 ve bu işletim sistemi için de dosya ~ / .ssh / config.
H2ONaCl

5
OS X 10.8.4 hata veriyorBad configuration option: ClientAliveInterval
ohho

3
Bad configuration optionOSX 10.8.4'te de aynı hatayı alıyorum.
Nick Heiner

10
Genel olarak, bu iki komutu sistemin farklı bölümlerine yerleştirirsiniz. OSX istemci tarafında yalnızca ServerAliveInterval ... ve sshd config dosyasında yalnızca ClientAliveInterval ...
ftrotter 23:13

2
Maymun bana dedi ki: "Neden kendini
yazmıyorsun

85

SSH oturumları sayısız ve muhtemelen kaçınılmaz nedenlerden dolayı bozulabilir.

Bunun neden olduğu sorunları azaltmak için kullanılabilecek faydalı bir yardımcı programdır screen. Ekran, ssh oturumundan bağımsız olarak hayatta kalacak birden fazla terminali kontrol etmenizi sağlayan güçlü bir yardımcı programdır. Örneğin, screenbir ssh oturumunda çalıştırıyorsanız , yeni bir terminal açıldığını göreceksiniz ve bunu işleri çalıştırmak için kullanabilirsiniz. Ssh oturumunuzun bu sırada öldüğünü söyleyelim. screen -dSonra çalışan screen -rson oturumu yeniden açacak ve oradan devam edebileceksiniz. Kullanmadan önce bazı belgeleri okuduğunuzdan emin olun .


5
Bu muhtemelen en iyi cevap, neden daha yüksek oylanmadığına emin değilim. Diğer "düzeltmeler" aslında bir SSH bağlantısını sürdürmekle ilgileneceğiniz özel durumlarda yardımcı olur, ancak çoğu durumda, asıl endişenin, herhangi bir müşteri / sunucu bağlantı sorununa bakılmaksızın, amaçlanan işlemlerin çalışmaya devam etmesi olduğunu düşünüyorum. .
Paul McMurdie

16
Ayrıca Tmux'u ekrana bir alternatif olarak eklerdim . Ekrandan daha çok yönlü ve kararlı buluyorum.
cumadaymeetssunday

2
sadece ileride başvurmak üzere buradan ayrılmak - screen -d -rson oturumunuzu kurtarmak için rahatlıkla koşabilirsiniz .
doplumi

2
Ya da basitçe screen -dr. Veya screen -xne yapmayı planladığınıza bağlı olarak. Mesele şu ki, bir kişi bütün bu anahtarların ne yaptığını bilmeli, böylece uygun olanları kullanabilmeli ve sadece internet kullanıcılarının önerilerini kör biçimde takip etmemelidir. Burada güzel bir küçük özet var: ss64.com/bash/screen.html
flith

Bu soruna bir cevap değil
user3728501

46

Müşteri yapılandırma

Dosyayı oluşturmayı deneyin:

~/.ssh/config

İçeriği ekleyin:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Şimdi sunucunuza ssh ve sorunun çözülüp çözülmediğine bakın. ClientAliveInterval seçeneği yalnızca ssh sunucusunu (aka sshd) yapılandırırken kullanışlıdır, ssh istemci tarafında bir şeyi değiştirmez, bu nedenle yukarıdaki yapılandırma dosyasında kullanmayın.

Eğer önceki 30 saniyede hiçbir paket alınmamışsa, sunucuya bir merhaba-oradasınız sinyali gönderir (yukarıda belirtildiği gibi). Bununla birlikte, ardışık merhaba-sen-oradasınız sinyallerinin sayısı ServerAliveCountMax'a ulaşırsa, ssh sunucudan ayrılacaktır. Bu değer varsayılan olarak 3'tür (yani 3 * 30 = 90 saniye sunucu etkinliği olmadan), gereksinimlerinize uygunsa artırın. .Ssh / config dosyasına daha fazla config seçeneği var ve okuyabilirsiniz:

Bir SSH Config Dosyası Kullanma

Diğer seçenekler hakkında daha fazla bilgi için. Bunu, bağlanacağınız her sunucuya uygulamak istemeyebilirsiniz. Ya çizgiyi değiştirerek yalnızca belirli bir sunucuya dizginlemek Host *ile Host <IP>(ssh_config man sayfasına bakın, bir IP adresi ile değiştirin).

Sunucu yapılandırması

Benzer şekilde, sunucuya müşterilerinize karşı nazik olmalarını söyleyebilirsiniz. Yapılandırma dosyası /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Sen ayarlayarak devre dışı ya ClientAliveIntervalhiç 0ya da çimdik ClientAliveIntervalve ClientAliveCountMaxprob yanıt vermeden maksimum ssh istemci hareketsizlik ayarlayın. Bu ayarların TCPKeepAlive'ye göre bir avantajı, sinyallerin şifreli kanallardan gönderilmesidir, bu nedenle sahtecilik olasılığı daha düşüktür.


Çalışmıyor. Yine aynı hatayı görüyorum.
user997704

3
Doğrudan komut satırından deneyin ve aşağı gidin: ssh -o ServerAliveInterval = 5 user @ host
Matt

Bunu da denedim ... işe yaramadı. Gerçekten benim sistem ile ne olup bittiğini bilmiyorum
user997704

2
Bu ClientAliveCountMax, DEĞİL ClientAliveMaxCount
David G

@DavidG Lütfen cevabınızı düzeltmelerle düzenleyin.
CivMeierFan

23

Bir Ubuntu sunucusunu uzaktan Lucid'den kesin olarak yükseltiyorum ve yükseltme işleminin ortasında "Yazma başarısız oldu. Brocken borusu" mesajı ile ssh bağlantısını kaybettim. ClientAliveInterval ve ServerAliveInterval hiçbir şey yapmadı. Çözüm, ssh istemcisindeki TCPKeepAlive seçeneklerini açmaktır:

TCPKeepAlive yes

içinde

/etc/ssh/ssh_config

20

Müşteri için ~/.ssh/config(veya /etc/ssh/ssh_config) dosyanızı aşağıdaki gibi düzenleyin :

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Sistemin TCP korunan mesajları diğer tarafa göndermesi gerekip gerekmediğini belirtir. Gönderilirlerse, bağlantının kesilmesi veya makinelerden birinin çökmesi uygun şekilde fark edilir. Bununla birlikte, rota geçici olarak devre dışı kaldığında bağlantıların kesileceği ve bazılarının can sıkıcı bulduğu anlamına gelir (Varsayılan 'evet').

ServerAliveInterval - Sunucudan veri alınmadıysa, ssh (1), sunucudan bir yanıt istemek için şifreli kanal üzerinden bir mesaj gönderir. Varsayılan değer 0'dır, bu mesajların sunucuya gönderilmeyeceğini belirtir.


Sunucu için, aşağıdakileri düzenleyin /etc/ssh/sshd_config:

ClientAliveInterval 600
ClientAliveCountMax 0

Eğer ssh istemcisinin 10 dakika sonra (600 saniye) otomatik olarak çıkmasını (zaman aşımı) istiyorsanız.

ClientAliveCountMax - Bu, ssh istemcisinden herhangi bir yanıt almadan ssh sunucusu tarafından gönderilen toplam onay mesajının sayısını gösterir. Varsayılan 3'tür.

ClientAliveInterval - Bu saniye cinsinden zaman aşımını gösterir. X saniyeden sonra, ssh sunucusu müşteriye yanıt isteyen bir mesaj gönderir. Sağırlık 0'dır (sunucu kontrol etmesi için müşteriye mesaj göndermez.).


Ayrıca bakınız: Seçenekler ServerAliveIntervalve ClientAliveIntervalsshd_config içindeki işlemler tam olarak ne yapar?


Bir ServerAliveCountMax'ı istemcideki varsayılan değerden daha yükseğe ayarlamak, bağlantının yavaş bağlantılar için canlı kalmasına yardımcı olmalıdır.
jonnyjandles

17

Mosh'u kesinlikle seviyorum. Sık sık bir sunucuya ssh, dizüstü bilgisayarımı kapatıp bir kafeye gidiyorum, açıyorum ve sanki hiçbir şey değişmemiş gibi devam ediyorum.

Mosh (mobil kabuk)

Sağlar uzak terminal uygulama dolaşım destekler zaman bağlantı ve akıllı içerir , yerel yankı ve kullanıcı tuş vuruşlarını satır düzenlemeyi.

Mosh, SSH'nin yerine geçti. Özellikle Wi-Fi, hücresel ve uzun mesafeli bağlantılar üzerinden daha sağlam ve duyarlı.

Mosh, GNU / Linux, FreeBSD, Solaris, Mac OS X ve Android için kullanılabilen ücretsiz bir yazılımdır.


6

Write failed: Broken pipeBenim için aktif olarak vim yazarken veya kabuk isteminde bile oluyordum . Bir süredir yerel olarak da internette dolaşamadım. (Terminal kullanarak uzaktan Ubuntu'ya bağlanıyordum.)

Ağımdaki diğerleri Netflix ve diğer yerlerdeki bir çok video akışını yayınlar. Bunu kanıtlayamıyorum, ancak bunun bir ISS veya yönlendirici sorunu olduğundan şüpheleniyorum. Örneğin, Verizon ve Netflix, müşterilerin ağ problemleri için birbirlerine parmakları işaret ediyor.

Çevirmeli ağ bağlantınız varsa ve aynı anda SSH veya telnet bağlantısı olan video veya müzik akışı yapıyorsanız, bir noktada kaçınılmaz bir kesinti mesajı alırsınız. ISS'lerimin geniş bant paketini yükseltmek, kopuk bağlantımı daha az sıkıyor gibi görünüyordu.



3

SSH yapılandırma istemcisi veya sunucusundan bağımsız olarak, uzak sunucuda hiçbir zaman başarısız gözükmeyen bir komut dosyası var.

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

Bazı dummy.sh dosyalarına kaydedin ve pencereyi simge durumuna küçültmeden veya ondan uzaklaşmadan önce hızlıca çalıştırın. Sunucudaki geçerli zaman damgasını yazdırmaya devam edecek ve bağlantı başka bir nedenden dolayı kesilmediği sürece bağlantınızı canlı tutacaktır. Bu terminale geri döndüğünde, sadece CTRL + C tuşlarına bas ve çalışmaya devam et.


9
ya da sadece terk topçalışan
Eben Geer

1

Bu arshları ssh'yi her çağırışınızda ekleyebilirsiniz: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Bunu yaparsanız / etc / ssh / * config dosyalarını düzenlemeniz gerekmez.

Bunu kolaylaştırmak için bir bash takma adı veya işlevi veya komut dosyası oluşturabilirsiniz.

Örneğin, bu bash işlevlerini, .bashrc içine ekleyebilirsiniz, do_ssh, sakalları açmak için elle kullanılır. do_ssh_pty komut dosyası içinde pty değerini belirlemek ve istemleri önlemek için kullanılır.

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 $*
}

Şimdi do_ssh user@hostkullanılabilir veya do_ssh user@host <args> <command>saklayıcılar aktif olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.