Что означает сообщение «Сломанный канал» в сеансе SSH?

103

Иногда моя сессия SSH отключается с Write failed: Broken pipeсообщением. Что это значит? И как я могу сохранить свою сессию открытой?

Я знаю о screen, но это не тот ответ, который я ищу. Я думаю, что это sshdвариант конфигурации.

Питер Стуйфзанд
источник

Ответы:

89

Возможно, ваш сервер закрывает соединения, которые простаивают слишком долго. Вы можете обновить либо ваш клиент ( ServerAliveInterval) или ваш сервер ( 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.

Чтобы обновить ваш сервер (и перезапустить ваш sshd)

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

Или на стороне клиента:

echo "ServerAliveInterval 60" >> ~/.ssh/config 
Герт
источник
NB , что иногда "* AliveInterval" не хватает stackoverflow.com/questions/10665267/...
rogerdpack
1
На ~/.ssh/configмоем Mac его нет, нужно ли его создавать там или это где-то еще?
AGamePlayer
5
@AwQiruiGuo Да, вы должны ~/.sshсначала создать каталог ( ). Итакmkdir -p ~/.ssh; chmod 700 ~/.ssh; touch ~/.ssh/config
Герт
6

Альтернативным решением будет использование mosh- мобильная оболочка . В отличие от ssh он подключается через UDP и поддерживает роуминг. Вы можете начать сеанс дома, приостановить работу своего ноутбука, взять его на работу / друзей / где бы у вас ни был Интернет, отключить ноутбук и продолжить работу, как будто ничего не произошло. Это особенно полезно, если у вас плохое интернет-соединение: оно показывает мгновенную обратную связь, если ваши нажатия клавиш не доходят до сервера, и постоянно пытается восстановить соединение.

Установка и настройка просты: теперь она включена во все текущие дистрибутивы Linux (плюс несколько не-Linux) и координирует инициализацию сеанса и аутентификацию через предыдущее ssh-соединение. Так что, если вы можете подключиться через ssh user@serverнего, очень вероятно, что вы сможете подключиться к mosh, просто позвонив mosh user@server, если пакеты mosh установлены на обоих концах.

Основная причина сбоев соединения заключается в том, что для работы mosh необходимо подключиться к серверу через порт UDP (диапазон по умолчанию: 60000-61000). Так что, если сервер находится за брандмауэром, вам в большинстве случаев не повезло, если вы не можете пробить себе дыру в нем ( последствия для безопасности ).

Персеиды
источник
3

Если вы хотите иметь более длительный период подключения, в клиенте добавьте:

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

ServerAliveCountMaxпо умолчанию это значение равно 3. Поэтому, после того ServerAliveIntervalкак сервер отправит 3 небольших пакета информации, он автоматически выйдет из системы. Установка его на 1200 означает, что этот процесс должен произойти не менее 1200 раз. Короче говоря, вы должны быть подключены не менее 30 * 1200 секунд (10 часов).

Франсиско Коста
источник
5
Зачем использовать sudo для файла, который либо принадлежит текущему пользователю, либо еще не существует?
Hubert Grzeskowiak
2

Обычно это означает, что ваше сетевое (TCP) соединение было сброшено. Например, ваш интернет-провайдер переподключил вас или что-то в этом роде.

maxschlepzig
источник
1

У меня была такая же проблема, но это не так, как ожидалось. Если вы обнаружите, что в той же сети другой сервер пытается получить тот же IP-адрес, вы столкнетесь с той же проблемой. Чтобы решить эту проблему, вам нужно проверить, есть ли другие серверы, которые используют тот же IP-адрес. Это можно сделать с помощью arpкоманды.

Я использую Debian, поэтому вот пример команд, которые я использую, чтобы определить, действительно ли другой сервер использовал тот же 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)

Вы заметите два набора MAC-адресов, использующих один и тот же IP-адрес. Избегайте конфликтов, устанавливая один IP-адрес на другой.

Билл Энг
источник
0

Другая причина появления сообщения «Broken Pipe» заключается в том, что другая машина пытается использовать тот же IP-адрес, что и ваш хост.

Простой способ проверить, использует ли кто-то этот IP:

  1. Выключи свой хост
  2. пингуйте тот же IP, чтобы видеть, использует ли другой компьютер тот IP

Чтобы узнать, какие машины находятся в вашей сети, вы можете использовать заголовок вопроса Unix & Linux: Как найти, какие другие машины подключены к локальной сети .

Josir
источник