Önlemek için ssh'yi hem istemcide hem de sunucularda yapılandırmak için ne yapabilirim Write Failed: broken pipe
hatalar mı? Genellikle istemci bilgisayarınızı uyku moduna geçirir ve daha sonra devam ettirirseniz oluşur.
Bunu denedim /etc/ssh/ssh_config
Linux ve Mac için:
Host *ServerAliveInterval 120
Bu, saniyeler içinde sunucuya ne sıklıkta bir keepalive iletisi göndermesi gerektiğidir. Bu işe yaramazsa, çalışırken her iki dakikada bir enter tuşuna basması için bir maymunu eğitin.
İkisini de ayarlayabilirsiniz ServerAliveInterval
içinde /etc/ssh/ssh_config
istemci makinenin veya ClientAliveInterval
içinde /etc/ssh/sshd_config
sunucu makinesinin. Hatayı almaya devam ediyorsanız aralığı azaltmayı deneyin.
Tek bir kullanıcı için yapılandırma dosyasında ayarlanabilir ~/.ssh/config
hem sunucu hem de istemci tarafında. Dosyanın doğru izinlere sahip olduğundan emin olun chmod 644 ~/.ssh/config
.
SSH oturumları çok sayıda ve muhtemelen kaçınılmaz nedenlerden dolayı bozulabilir.
Bunun neden olduğu sorunları azaltmak için kullanılabilecek kullanışlı bir yardımcı program denir 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, çalıştırırsanız screen
bir ssh oturumunda yeni bir terminalin açıldığını göreceksiniz ve bunu işleri çalıştırmak için kullanabilirsiniz. Ssh oturumunuzun bu süreçte öldüğünü varsayalım. Koşma screen -d
sonra screen -r
son oturumu yeniden açacak ve oradan devam edebileceksiniz. Okuduğunuzdan emin olun belgelerden bazıları kullanmadan önce.
İstemci yapılandırması
Dosyayı oluşturmayı deneyin:
~/.ssh/config
İçeriği ekle:
Host * ServerAliveInterval 30 ServerAliveCountMax 5
Şimdi sunucunuza ssh yapın ve sorununuzun giderilip giderilmediğ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 hiçbir şeyi değiştirmez, bu nedenle yukarıdaki yapılandırma dosyasında kullanmayın.
Bu, önceki 30 saniye içinde (yukarıda belirtildiği gibi) paket alınmadıysa, sunucuya bir merhaba-siz-siz sinyali gönderir. Ancak, ardışık hello-are-you-there sinyallerinin sayısı serveralivecountmax'a ulaşırsa, ssh sunucudan kesilir. Bu değer varsayılan olarak 3'tür (bu nedenle sunucu etkinliği olmadan 3 * 30 = 90 saniye), gereksinimlerinize uygunsa artırın. Bunun için çok daha fazla yapılandırma seçeneği var.ssh / config dosyası ve okuyabilirsiniz:
Bir SSH Yapılandırma Dosyası Kullanma
Diğer seçenekler hakkında daha fazla bilgi için. Bunu, bu örnekte bağlanacağınız her sunucuya uygulamak istemeyebilirsiniz. Veya satırı değiştirerek yalnızca belirli bir sunucuya sınırlayın Host *
ile Host <IP>
(bir IP adresiyle değiştirin, bkz. ssh_config man sayfası).
Sunucu yapılandırması
Benzer şekilde, sunucuya müşterilerinize karşı nazik olmasını söyleyebilirsiniz. Yapılandırma dosyası /etc/ssh/sshd_config
.
ClientAliveInterval 20ClientAliveCountMax 5
Ayarlayarak devre dışı bırakabilirsiniz ClientAliveInterval
-e doğru 0
veya çimdik ClientAliveInterval
ve ClientAliveCountMax
problara yanıt vermeden maksimum bir ssh istemcisi hareketsizliği ayarlamak için. Bu ayarların TCPKeepAlive üzerindeki avantajlarından biri, sinyallerin şifreli kanallardan gönderilmesidir, bu nedenle sahte olma olasılığı daha düşüktür.
Bir Ubuntu sunucusunu lucid'den precise'e uzaktan yükseltiyorum ve yükseltmenin ortasında ssh bağlantısını "Yazma başarısız oldu" mesajıyla kaybettim. Kırık boru". ClientAliveInterval ve ServerAliveInterval hiçbir şey yapmadı. Çözüm, istemci ssh'sinde TCPKeepAlive seçeneklerini açmaktır:
TCPKeepAlive yes
içinde
/etc/ssh/ssh_config
Umarım bu yardımcı olur
Müşteri için aşağıdakileri düzenleyin: ~/.ssh/config
(veya /etc/ssh/ssh_config
) aşağıdaki gibi dosya:
Host * TCPKeepAlive yes ServerAliveInterval 120
TCPKeepAlive - Sistemin diğer tarafa TCP keepalive iletileri gönderip göndermeyeceğini belirtir. Gönderilirse, bağlantının ölümü veya makinelerden birinin çökmesi düzgün bir şekilde fark edilir. Ancak bu, rota geçici olarak kesilirse bağlantıların öleceği ve bazı kişilerin rahatsız edici bulduğu anlamına gelir (varsayılan değer 'evet' dir).
ServerAliveInterval - Saniyeler içinde bir zaman aşımı aralığı ayarlar, bundan sonra sunucudan veri alınmazsa ssh (1) sunucudan yanıt istemek için şifreli kanal üzerinden bir mesaj gönderir. Bu iletilerin sunucuya gönderilmeyeceğini belirten varsayılan değer 0'dır.
Sunucu için, sunucunuzu düzenleyin. /etc/ssh/sshd_config
olarak:
ClientAliveInterval 600ClientAliveCountMax 0
Ssh istemcisinin 10 dakika (600 saniye) sonra otomatik olarak çıkmasını (zaman aşımı) istiyorsanız.
ClientAliveCountMax – Bu, ssh istemcisinden herhangi bir yanıt almadan ssh sunucusu tarafından gönderilen checkalive mesajının toplam sayısını gösterir. Varsayılan değer 3'tür.
ClientAliveInterval - Bu saniye cinsinden zaman aşımını gösterir. X saniye sonra, ssh sunucusu istemciye yanıt isteyen bir mesaj gönderir. Sağırlık 0'dır (sunucu kontrol etmek için istemciye mesaj göndermez.).
Ayrıca bakınız: Bu seçenekler ne anlama geliyor ServerAliveInterval
ve ClientAliveInterval
tam olarak sshd_config'de mi?
Mosh'u kesinlikle seviyorum. Sık sık bir sunucuya ssh yapıyorum, dizüstü bilgisayarımı kapatıyorum ve bir kafeye gidiyorum, açıyorum ve hiçbir şey değişmemiş gibi devam ediyorum.
Mosh (mobil kabuk)
İzin veren uzak terminal uygulaması gezici, destekler aralıklı bağlantı, ve akıllı sağlar yerel yankı ve kullanıcı tuş vuruşlarının satır düzenlemesi.
Mosh, ssh'nin yerine geçer. Ö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.
Benim için, alıyordum Write failed: Broken pipe
vim'de veya kabuk isteminde aktif olarak yazarken bile. Ben de bir süre internete yerel olarak göz atamadım. (Terminal kullanarak Ubuntu'ya uzaktan bağlanıyordum.)
Ağımdaki diğerleri Netflix'ten ve diğer yerlerden çok fazla video akışı yapıyor. Bunu kanıtlayamıyorum, ancak bunun bir ISS veya yönlendirici sorunu olduğundan şüpheleniyorum. Örneğin, Verizon ve Netflix, müşterilerinin ağ sorunları için birbirlerine işaret ediyor.
Çevirmeli bağlantınız varsa ve eşzamanlı bir SSH veya telnet bağlantısıyla video veya müzik akışı yapıyorsanız, bir noktada kırık bir boru mesajı almanız kaçınılmazdır. ıss'lerimin geniş bant paketini yükseltmek, kopmuş bağlantımı daha az sıklıkta yapıyor gibiydi.
Bir Ubuntu VM olmadığı için cevabımı buraya gönderdim.
ssh -o IPQoS=throughput user@host
Uzak sunucuda, SSH yapılandırma istemcisinden veya sunucusundan bağımsız olarak hiçbir zaman başarısız görünmeyen bir komut dosyam var.
#!/bin/bashwhile true; do date; sleep 10; done;
Bazılarına sakla dummy.sh pencereyi simge durumuna küçültmeden veya uzaklaştırmadan önce dosyayı dosyalayın ve hızlı bir şekilde çalıştırın. Geçerli zaman damgasını sunucuya yazdırmaya devam eder ve bağlantı başka bir nedenle kesilmediği sürece bağlantınızı canlı tutar. Bu terminale geri döndüğünüzde, CTRL + C tuşlarına basın ve çalışmaya devam edin.
Ssh'yi her çağırdığınızda bu arg'leri ekleyebilirsiniz: -o ServerAliveInterval=15 -o ServerAliveCountMax=3
Bunu yaparsanız /etc/ssh/*config dosyalarını düzenlemenize gerek yoktur.
Bunu kolaylaştırmak için bir bash takma adı veya işlev veya komut dosyası oluşturabilirsiniz.
Örneğin, bu bash fonksiyonları, içine ekleyebilirsiniz.bashrc, do_ssh keepalives'ı açmak için el ile kullanılır. do_ssh_pty komut dosyaları içinde pty'yi ayarlamak 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@host
kullanılabilir veya do_ssh user@host <args> <command>
ve keepalives aktif olacak.
@DavidL rant yapmadan önce soruları daha iyi okumalısınız. Sorununuz, bilgisayarı uyku moduna geçirmekten açıkça bahseden operasyonunkiyle aynı değil. Bu arada cevaplardan sadece biri (“mosh”) ve sorudan 2 yıl sonra gönderildi. Bununla birlikte, diğer cevaplar bir sonraki en iyi şeyi yapar; bu, sizinki gibi daha kolay çözülebilecek davalara çözümler önermektir. Sakin ol, bu kadar stresli olma, rant yapmak buralarda işe yaramaz…
Gerçekten hiçbir şey. Oturum yarıda kesildi ve oturumun güvenliği tehlikeye girdi. Comp’i uyku moduna geçirmezseniz, istemcinin sunucuya canlı kalp atışı yapması için canlı tutma süresi ayarlayabilirsiniz, ancak sistem uyuyacaksa yapılabilecek hiçbir şey yoktur.
Yanılıyorsunuz: AYNI sunucuya bağlanan iki masaüstü istemci makinem var. Bunlardan biri, SSH istemcisi iyi çalışan ve bağlantıyı saatlerce sürdüren ubuntu 12.10, Quantal. Diğeri Ubuntu 14.10, Ütopik, diğerini bir kenara bırakıp yeni bir kurulumda; birkaç dakika sonra, bu mesajla kendini engeller. Makinedeki ağ işlevlerinin geri kalanı kesintiye uğramaz. Yani hayır, bu ne bir ağ sorunu, ne de bir sunucu sorunu değil, “darkdragan” ın “hiçbir şey yapılamayacağını” söylemeye cüret ettiğinin aksine çözülebilecek belirli bir SSH İSTEMCİ yazılımı sorunu.
Bu durumda, bozuk bir ssh bağlantısını (muhtemelen çıkış koduna dayanarak) yeniden başlatmama ve `ekran’ kullanarak geri yüklememe izin verecek bir şey mi arıyorum?
Ve gerçekten de, dediğim gibi: insanlar @darkdragn’ın cesaret ettiği gibi “hiçbir şey yapılamaz” dediklerinde çok fazla konuşurlar. Aram Koçaryan 'ın cevabını okudum ve uyguladım: 20 dakika önce… Eski Quantal Ubuntu 12.10’umda, bu talimatı iki yıl önce o dosyaya uyguladığımı fark ettim ve oradaki istikrarın nedeni buydu. Burada yaptım ve bu son 20 dakika içinde bağlantı o zamandan beri sabit kaldı. Bu yüzden lütfen millet: “hiçbir şey yapılamayacağını” düşünmeye cesaret ederken kendinizden kaçının ve bu mesajı başkalarına bırakmaya çalışırken daha da kaçının.
@DavidL, naysaying’in can sıkıcı olabileceği konusunda hemfikirdir, özellikle de cehalet pozisyonundan.
Ancak, aynı zamanda biraz kişisel olarak almışsınız gibi görünüyor (aka biraz ranty). darkdragn prob iyi niyetli
SHH oturumları, uzun zaman ölçeğinde kaba kuvvet saldırılarını önlemek için şifreleme anahtarlarını zaman içinde döndürür. Uyku / devam bu güvenlik ve bağlantıyı keser.
Hiçbir şey aşağıdaki durum kadar hoş değildir. “Bu yapılamaz / Hiçbir şey yapılamaz” diyen bir kişi, “bak” diyen biri tarafından cevaplanır veya kesilir… Bitti ve kolaydı " @darkdragn
Aynı adrese sahip iki cihaz olduğunda ağdaki aynı sorun.
Bunlardan birini kapatın ve sorun çözüldü.