Co oznacza komunikat Broken pipe w sesji SSH?

103

Czasami moja sesja SSH rozłącza się z Write failed: Broken pipekomunikatem. Co to znaczy? Jak mogę zachować otwartą sesję?

Wiem o tym screen, ale nie takiej odpowiedzi szukam. Myślę, że to jest sshdopcja konfiguracji.

Peter Stuifzand
źródło

Odpowiedzi:

89

Możliwe, że serwer zamyka zbyt długo nieaktywne połączenia. Możesz zaktualizować klienta ( ServerAliveInterval) lub serwer ( ClientAliveInterval)

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

 ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the client, sshd(8) will send a message
         through the encrypted channel to request a response from the
         client.  The default is 0, indicating that these messages will
         not be sent to the client.  This option applies to protocol
         version 2 only.

Aby zaktualizować serwer (i zrestartować sshd)

echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config

Lub po stronie klienta:

echo "ServerAliveInterval 60" >> ~/.ssh/config 
Gert
źródło
Uwaga: czasami „* AliveInterval” to za mało stackoverflow.com/questions/10665267/…
rogerdpack
1
Na ~/.ssh/configmoim Macu nie ma, czy muszę go tam utworzyć, czy jest gdzieś indziej?
AGamePlayer
5
@AwQiruiGuo Tak, najpierw należy utworzyć katalog ( ~/.ssh). Więcmkdir -p ~/.ssh; chmod 700 ~/.ssh; touch ~/.ssh/config
Gert
6

Alternatywnym rozwiązaniem byłoby użycie mosh- mobilnej powłoki . W przeciwieństwie do ssh łączy się przez UDP i obsługuje roaming. Możesz rozpocząć sesję w domu, zawiesić laptopa, zabrać go do pracy / przyjaciół / gdziekolwiek indziej, gdzie masz internet, odłożyć laptopa i kontynuować pracę, jakby nic się nie wydarzyło. Jest to szczególnie przydatne, jeśli masz kiepskie połączenie internetowe: Pokazuje natychmiastowe informacje zwrotne, jeśli twoje naciśnięcia klawiszy nie docierają do serwera i ciągle próbują przywrócić połączenie.

Instalacja i konfiguracja są proste: jest teraz uwzględnione we wszystkich obecnych dystrybucjach Linuksa (plus kilka innych niż Linux) i koordynuje inicjowanie sesji i uwierzytelnianie poprzez wcześniejsze połączenie ssh. Więc jeśli jesteś w stanie połączyć się za pośrednictwem ssh user@server, najprawdopodobniej będziesz w stanie połączyć się z mosh tylko przez wywołanie mosh user@server, jeśli pakiety mosh są zainstalowane na obu końcach.

Głównym powodem awarii połączenia jest to, że musisz połączyć się z serwerem na porcie UDP (domyślny zakres: 60000-61000), aby mosh działał. Jeśli więc serwer znajduje się za zaporą ogniową, przeważnie masz pecha, jeśli nie możesz samodzielnie wykopać w nim dziur ( konsekwencje dla bezpieczeństwa ).

Perseidy
źródło
3

Jeśli chcesz mieć dłuższy okres połączenia, w kliencie dodaj:

echo 'ServerAliveInterval 30' | sudo tee -a ~/.ssh/config
echo 'ServerAliveCountMax 1200' | sudo tee -a ~/.ssh/config

ServerAliveCountMaxdomyślnie jest to ustawione na 3. Dlatego po ServerAliveIntervalwysłaniu 3 małych paczek informacji na twój serwer automatycznie się wyloguje. Ustawienie go na 1200 oznacza, że ​​proces ten będzie musiał wystąpić co najmniej 1200 razy. Krótko mówiąc, powinieneś być podłączony co najmniej 30 * 1200 sekund (10 godzin).

Francisco Costa
źródło
5
Po co używać sudo do pliku, który należy do bieżącego użytkownika lub jeszcze nie istnieje?
Hubert Grzeskowiak
2

Zazwyczaj oznacza to, że połączenie sieciowe (TCP) zostało zresetowane. Np. Twój dostawca Internetu ponownie Cię połączył lub coś takiego.

maxschlepzig
źródło
1

Miałem ten sam problem, ale nie jest to zgodne z oczekiwaniami. Jeśli stwierdzisz, że w tej samej sieci inny serwer próbuje uzyskać ten sam adres IP, napotkasz ten sam problem. Aby rozwiązać ten problem, musisz sprawdzić, czy istnieją inne serwery, które używają tego samego adresu IP. Można to zrobić za pomocą arppolecenia.

Korzystam z Debiana, więc oto próbka poleceń, których używam do ustalenia, czy inny serwer rzeczywiście używa tego samego adresu IP

apt-get install arp-scan
arp-scan -I eth0 -l | grep 192.168.1.42
  192.168.1.42 d4:eb:9a:f2:11:a1 (Unknown)
  192.168.1.42 f4:23:a4:38:b5:76 (Unknown) (DUP: 2)

Zauważysz dwa zestawy adresów MAC przy użyciu tego samego adresu IP. Unikaj konfliktu, ustawiając jeden na inny adres IP.

Bill Ang
źródło
0

Inną przyczyną „komunikatu o uszkodzonej rurze” jest to, że inna maszyna próbuje użyć tego samego adresu IP co host.

Prosty sposób sprawdzenia, czy ktoś używa tego adresu IP:

  1. Wyłącz hosta
  2. pingować ten sam adres IP, aby sprawdzić, czy inny komputer używa tego adresu IP

Aby dowiedzieć się, które maszyny są w twojej sieci, możesz użyć tego pytania z pytaniami na Unixa i Linuksa: jak znaleźć inne maszyny podłączone do sieci lokalnej .

Josir
źródło