it-swarm.dev

Jak zabránit „Zápis selhal: rozbité potrubí“ při připojení SSH?

Co mohu udělat, abych nakonfiguroval SSH na klientovi i na serverech, abych zabránil chybám Write Failed: broken pipe? K tomu často dochází, pokud spíte klientský počítač a pokračujete později.

310
sorin

Zkoušel jsem to v /etc/ssh/ssh_config pro Linux a Mac:

Host *
ServerAliveInterval 120

To je, jak často, během několika sekund, by měla serveru zasílat udržovací zprávu. Pokud to nefunguje, vycvičte opici, aby během práce stiskla každé dvě minuty klávesu enter.

Dalo by se nastavit ServerAliveInterval v /etc/ssh/ssh_config klientského počítače nebo ClientAliveInterval in /etc/ssh/sshd_config serveru. Pokud se chyba stále zobrazuje, zkuste interval zkrátit.

Konfigurace pro jednoho uživatele může být nastavena v souboru ~/.ssh/config na straně serveru i klienta. Ujistěte se, že soubor má správná oprávnění chmod 644 ~/.ssh/config.

288
Aram Kocharyan

Relace SSH se mohou přerušit z mnoha a pravděpodobně nevyhnutelných důvodů.

Užitečný nástroj, který lze použít ke zmírnění problémů způsobených tímto, se nazývá screen. Obrazovka je výkonný nástroj, který umožňuje ovládat více terminálů, které zůstanou naživu nezávisle na ssh relaci. Pokud například spustíte screen v ssh relaci, uvidíte nový terminál otevřený a můžete jej použít ke spuštění úloh. Řekněme, že v tomto procesu vaše ssh relace zemře. Běh screen -d pak screen -r znovu otevře poslední relaci a budete odtud moci pokračovat. Před použitím si přečtěte část dokumentace .

93
eltommo

Konfigurace klienta

Zkuste vytvořit soubor:

~/.ssh/config

Přidejte obsah:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Nyní ssh na váš server a zjistit, zda je váš problém opraven. Možnost ClientAliveInterval je užitečná pouze při konfiguraci serveru ssh (aka sshd), nemění nic na straně klienta ssh, takže jej nepoužívejte ve výše uvedeném konfiguračním souboru.

Toto vyšle signál hello-you-there-server na server, pokud nebyly během posledních 30 sekund přijaty žádné pakety (jak je uvedeno výše). Pokud však počet po sobě jdoucích signálů hello-are-you-there dosáhne serveru ServerAliveCountMax, ssh se odpojí od serveru. Tato hodnota je standardně nastavena na 3 (takže 3 * 30 = 90 sekund bez činnosti serveru), zvyšte ji, pokud to vyhovuje vašim potřebám. K souboru .ssh/config existuje mnohem více možností konfigurace a můžete si přečíst:

Použití konfiguračního souboru SSH

Další informace o dalších možnostech. Možná to nebudete chtít použít na každý server, ke kterému se připojíte, na kterém bude tento příklad. Nebo jej omezte pouze na konkrétní server nahrazením řádku Host * s Host <IP> (nahrazeno IP adresou, viz manuálová stránka ssh_config).

Konfigurace serveru

Podobně můžete říct serveru, aby byl šetrný ke svým klientům. Konfigurační soubor je /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Můžete jej deaktivovat nastavením ClientAliveInterval na 0 nebo Tweak ClientAliveInterval a ClientAliveCountMax pro nastavení maximální nečinnosti ssh klienta bez odpovědi na sondy. Jednou výhodou tohoto nastavení oproti TCPKeepAlive je to, že signály jsou posílány šifrovanými kanály, takže je méně pravděpodobné, že budou spoofable.

53
Matt

Vzdáleně upgraduji server Ubuntu z přehledného na přesný a ztratil jsem spojení ssh uprostřed upgradu zprávou „Zápis selhal. Zlomená trubka“. ClientAliveInterval a ServerAliveInterval neudělali nic. Řešením je zapnutí možností TCPKeepAlive v klientském ssh:

TCPKeepAlive yes

v

/etc/ssh/ssh_config

Doufám, že to pomůže

27
Alexey Sviridov

Pro klienta upravte svůj ~/.ssh/config (nebo /etc/ssh/ssh_config) takto:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Určuje, zda by systém měl posílat TCP udržovací zprávy na druhou stranu. Pokud jsou odeslány, smrt připojení nebo selhání jednoho ze strojů bude správně zaznamenáno. To však znamená, že spojení zemře, pokud je trasa dočasně vypnuta, a někteří lidé to považují za nepříjemné (výchozí nastavení je „ano“).

ServerAliveInterval - Nastavuje časový limit v sekundách, po kterém, pokud ze serveru nebyla přijata žádná data, ssh (1) odešle zprávu šifrovaným kanálem požádat o odpověď ze serveru. Výchozí hodnota je 0, což znamená, že tyto zprávy nebudou odeslány na server.


Pro server upravte svůj /etc/ssh/sshd_config tak jako:

ClientAliveInterval 600
ClientAliveCountMax 0

Pokud chcete, aby klient ssh ukončil (timeout) automaticky po 10 minutách (600 sekund).

ClientAliveCountMax - Udává celkový počet kontrolních zpráv odeslaných serverem ssh, aniž by od klienta ssh byla získána odpověď. Výchozí hodnota je 3.

ClientAliveInterval - Označuje časový limit v sekundách. Po x počtu sekund zašle ssh server klientovi zprávu s žádostí o odpověď. Deafult je 0 (server neposílá zprávu klientovi ke kontrole.).


Viz také: Co přesně provedou možnosti ServerAliveInterval a ClientAliveInterval v sshd_config?

23
kenorb

Absolutně miluji Mosha. Často jsem narazil na server, zavřel jsem notebook a šel do kavárny, otevřel ho a pokračoval, jako by se nic nezměnilo.

Mosh (mobile Shell)

Vzdálená koncová aplikace, která umožňuje roaming , podporuje přerušovanou konektivitu a poskytuje inteligentní místní echo a editace řádků uživatelských úhozů.

Mosh je náhradou za SSH. Je robustnější a citlivější, zejména prostřednictvím Wi-Fi, celulárních a dálkových spojení.

Mosh je bezplatný software dostupný pro GNU/Linux, FreeBSD, Solaris, Mac OS X a Android.

18
Jake

Pro mě jsem dostával Write failed: Broken pipe, i když jsem aktivně psal vim nebo na Shell Prompt. Ani na chvíli jsem nemohl procházet internet místně. (Připojil jsem se vzdáleně k Ubuntu pomocí terminálu.)

Ostatní v mém síťovém proudu streamují hodně videa z Netflixu a dalších míst. Nemohu to dokázat, ale mám podezření, že se jedná o problém s ISP nebo routerem. Například Verizon a Netflix ukazují prstem na sebe kvůli problémům v síti svých zákazníků.

Pokud máte telefonické připojení a streamujete video nebo hudbu se simultánním připojením SSH nebo telnet, je v určitém okamžiku nevyhnutelné, abyste dostali zprávu o přerušeném kanálu. Zdálo se, že upgrade širokopásmového balíčku mých poskytovatelů internetových služeb způsobil, že mé přerušené připojení bylo méně časté.

6
Parag

Zde jsem zveřejnil svou odpověď, protože to nebyl Ubuntu VM.

https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-top-running

ssh -o IPQoS=throughput [email protected]
4
rupert160

Na vzdáleném serveru mám skript, který se nezdá selhat, bez ohledu na konfiguračního klienta nebo server SSH.

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

Uložte jej do nějakého souboru dummy.sh a rychle jej spusťte, než minimalizujete okno nebo se od něj vzdálíte. Bude tisknout aktuální časové razítko na server a bude udržovat vaše připojení naživu, dokud nebude připojení přerušeno z jakéhokoli jiného důvodu. Až se vrátíte k tomuto terminálu, stiskněte klávesy CTRL + C a pokračujte v práci.

3
JulioHM

Tyto argy můžete přidat pokaždé, když vyvoláte ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Pokud to uděláte, nemusíte upravovat/etc/ssh/* config soubory.

Pro zjednodušení můžete vytvořit bash alias nebo funkci nebo skript.

Např. Tyto bash funkce můžete přidat do vašeho .bashrc, do_ssh se používá ručně k zapnutí keepalives. do_ssh_pty se používá v skriptech k nastavení pty a vyhýbání se výzvám.

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

Nyní do_ssh [email protected] lze použít nebo do_ssh [email protected] <args> <command> a keepalives budou aktivní.

1
gaoithe