Как предотвратить «Write Failed: broken pipe» на SSH-соединении?

210

Что я могу сделать, чтобы настроить SSH на обоих клиентах и ​​серверах, чтобы предотвратить ошибки Write Failed: broken pipe ? Это часто происходит, если вы спятите свой клиентский компьютер и возобновите его позже.

    
задан sorin 29.04.2012 в 01:36
источник

9 ответов

197

Я пробовал это в /etc/ssh/ssh_config для Linux и Mac:

Host *
ServerAliveInterval 120

Так часто, в секундах, он должен отправить сообщение keepalive на сервер. Если это не сработает, тогда тренируйте обезьяну, чтобы нажимать каждые две минуты, пока вы работаете.

Вы можете установить ServerAliveInterval в /etc/ssh/ssh_config клиентской машины или ClientAliveInterval в /etc/ssh/sshd_config серверной машины. Попробуйте уменьшить интервал, если вы все еще получаете ошибку.

Конфигурация для одного пользователя может быть установлена ​​в файле ~/.ssh/config как на стороне сервера, так и на стороне клиента. Убедитесь, что файл имеет правильные разрешения chmod 644 ~/.ssh/config .

    
ответ дан Aram Kocharyan 26.05.2012 в 13:49
источник
64

Сессии SSH могут прерываться из-за многочисленных и, возможно, неизбежных причин.

Полезная утилита, которая может использоваться для устранения проблем, вызванных этим, называется screen . Экран - мощная утилита, которая позволяет вам управлять несколькими терминалами, которые останутся в живых независимо от сеанса ssh. Например, если вы запустите screen в сеансе ssh, вы увидите, что новый терминал открыт, и вы можете использовать его для запуска заданий. Допустим, ваша сессия ssh замирает в процессе. Запустив screen -d , screen -r снова откроет последний сеанс, и вы сможете продолжить оттуда. Перед использованием убедитесь, что вы прочитали часть документации .

    
ответ дан eltommo 04.10.2012 в 18:28
35

Конфигурация клиента

Попробуйте создать файл:

~/.ssh/config

Добавить содержимое:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Теперь ssh на ваш сервер и проверьте, исправлена ​​ли ваша проблема. Опция ClientAliveInterval полезна только при настройке ssh-сервера (aka sshd), это не изменяет ничего на стороне клиента ssh, поэтому не используйте его в вышеуказанном файле конфигурации.

Это отправит на сервер сигнал приветствия, если в течение предыдущих 30 секунд не было получено пакетов (как указано выше). Однако, если количество последовательных сигналов приветствия к вам достигнет ServerAliveCountMax, тогда ssh отключится от сервера. Это значение по умолчанию равно 3 (так 3 * 30 = 90 секунд без активности сервера), увеличивайте его, если оно соответствует вашим потребностям. В файле .ssh / config имеется больше опций конфигурации. Вы можете прочитать:

Использование файла конфигурации SSH

Подробнее о других параметрах. Возможно, вы не захотите применить это к каждому подключаемому серверу, к которому относится этот пример. Или ограничьте его только конкретным сервером, заменив строку Host * на Host <IP> (замените на IP-адрес, см. Страницу руководства ssh_config).

Конфигурация сервера

Аналогичным образом вы можете сказать серверу быть нежным с вашими клиентами. Файл конфигурации /etc/ssh/sshd_config .

ClientAliveInterval 20
ClientAliveCountMax 5

Вы можете отключить его, установив ClientAliveInterval на 0 или настроив ClientAliveInterval и ClientAliveCountMax , чтобы установить максимальную бездействие клиента ssh без ответа на пробники. Одним из преимуществ этих настроек над TCPKeepAlive является то, что сигналы отправляются через зашифрованные каналы, поэтому он менее вероятно, будет подделать.

    
ответ дан Matt 06.10.2013 в 04:54
20

Я удаленно обновляю сервер Ubuntu с ясного до точного и потерял ssh-соединение в середине обновления с сообщением «Write failed. Brocken pipe». ClientAliveInterval и ServerAliveInterval ничего не сделали. Решение состоит в том, чтобы включить параметры TCPKeepAlive в клиенте ssh:

TCPKeepAlive yes

в

/etc/ssh/ssh_config
    
ответ дан Alexey Sviridov 07.10.2012 в 20:40
15

Я абсолютно люблю Моша. Я часто нахожусь на сервере, закрываю свой ноутбук и иду в кафе, открываю его и продолжаю, как будто ничего не изменилось.

  

Мош (мобильная оболочка)

     

Приложение удаленного терминала, которое позволяет роуминг , поддерживает прерывистый   подключение и предоставляет интеллектуальные локальные   echo и редактирование строк пользовательских нажатий клавиш.

     

Мош является заменой SSH. Это более надежный и отзывчивый,   особенно по Wi-Fi, сотовой и междугородной связью.

     

Mosh - бесплатное программное обеспечение, доступное для GNU / Linux, FreeBSD, Solaris, Mac OS X и Android.

    
ответ дан Jake 30.09.2014 в 20:48
15

Для клиента отредактируйте файл ~/.ssh/config (или /etc/ssh/ssh_config ) следующим образом:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120
  

TCPKeepAlive . Указывает, должна ли система отправлять TCP keepalive   сообщений на другую сторону. Если они отправлены, смерть соединения   или крах одной из машин будет правильно замечен. Однако,   это означает, что соединения будут умирать, если маршрут временно отключен,   и некоторые люди находят это раздражающим (по умолчанию это «да»).

     

ServerAliveInterval . Устанавливает интервал ожидания в секундах, после которого   если данные не были получены с сервера, ssh (1) отправит   сообщение через зашифрованный канал для запроса ответа от   сервер. Значение по умолчанию равно 0, что означает, что эти сообщения не будут   отправляется на сервер.

Для сервера отредактируйте свой /etc/ssh/sshd_config как:

ClientAliveInterval 600
ClientAliveCountMax 0

Если вы хотите, чтобы ssh-клиент автоматически завершил (timeout) через 10 минут (600 секунд).

  

ClientAliveCountMax . Это указывает на общее количество проверок   сообщение, отправленное сервером ssh без получения ответа от   ssh. Значение по умолчанию: 3.

     

ClientAliveInterval - указывает время ожидания в секундах. После x   количество секунд, сервер ssh отправит клиенту сообщение с запросом   для ответа. Deafult - 0 (сервер не будет отправлять сообщение клиенту   проверьте.).

См. также: Что делают параметры ServerAliveInterval и ClientAliveInterval в sshd_config, точно?

    
ответ дан kenorb 02.10.2014 в 15:52
4

Для меня я получал Write failed: Broken pipe , даже когда я активно вводил vim или в командной строке. Я не мог просматривать интернет-локально ни на какое-то время. (Я подключался удаленно к Ubuntu, используя Terminal.)

Другие в моем сетевом потоке много видео из Netflix и других мест. Я не могу это доказать, но я подозреваю, что это проблема интернет-провайдера или маршрутизатора. Например, Verizon и Netflix указывают друг на друга по проблемам сети своих клиентов.

Если у вас есть модемное соединение и потоковое видео или музыка с одновременным соединением SSH или telnet, неизбежно в какой-то момент вы получите сообщение об сломанном трубе. Модернизация пакета широкополосных интернет-провайдеров показала, что мое сломанное соединение стало менее частым.

    
ответ дан Parag Magunia 30.07.2014 в 15:33
3

У меня есть сценарий на удаленном сервере, который никогда не сработает, независимо от клиента или сервера конфигурации SSH.

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

Сохраните его в файле dummy.sh и быстро запустите его, прежде чем сворачивать окно или отойти от него. Он будет печатать текущую метку времени на сервере и поддерживать ваше соединение до тех пор, пока соединение не будет удалено по какой-либо другой причине. Когда вы вернетесь к этому терминалу, просто нажмите CTRL + C и продолжайте работать.

    
ответ дан JulioHM 09.09.2013 в 18:50
0

Вы можете добавлять эти аргументы каждый раз при вызове ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Вам не нужно редактировать файлы конфигурации / etc / ssh / *, если вы это сделаете.

Вы можете создать псевдоним bash или функцию или скрипт, чтобы сделать это проще.

например. эти функции bash, которые вы можете добавить в свой .bashrc, do_ssh используется вручную, чтобы включить keepalives. do_ssh_pty используется в скриптах, чтобы установить pty и избежать запросов.

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

Теперь можно использовать do_ssh [email protected] или do_ssh [email protected] <args> <command> , а keepalives будут активны.

    
ответ дан gaoithe 12.02.2018 в 14:05