Как предотвратить & ldquo; Ошибка записи: сломанная труба & rdquo; по SSH соединению?

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

259
задан 26.02.2015, 03:50

10 ответов

Я пытался сделать это в /etc/ssh/ssh_config для Linux и Mac:

Host *
ServerAliveInterval 120

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

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

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

0
ответ дан 21.04.2019, 16:12
  • 1
    Да я делаю подобный, и это работает вполне хорошо на большинство вещей. – Amogh 25.08.2012, 14:25
  • 2
    I' m не на Mac, но Ubuntu 12.04 и файле для этой операционной системы также, кажется, ~/.ssh/config. – jDub9 15.12.2012, 02:26
  • 3
    OS X 10.8.4 дает ошибку Bad configuration option: ClientAliveInterval – tiomno 15.07.2013, 18:46
  • 4
    Я получаю тот же самый Bad configuration option ошибка на OSX 10.8.4. – Salman A 19.07.2013, 09:57
  • 5
    Обычно Вы помещаете эти две команды в различные части системы. Только ServerAliveInterval на стороне клиента OSX... и только ClientAliveInterval на sshd файле конфигурации... – ruuter 24.10.2013, 12:56

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

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

0
ответ дан 21.04.2019, 16:12
  • 1
    Это - вероятно, лучший ответ, I' m не уверенный, почему it' s не проголосовавший выше. Другой " fixes" полезны в особом случае, где Вы на самом деле заботились бы о поддержании соединения SSH, но в большинстве вариантов использования я предполагаю, что реальное беспокойство - то, что намеченные процессы продолжают работать, независимо от любых клиент-серверных проблем соединения что. – Salman A 04.06.2013, 07:33
  • 2
    Я также добавил бы Tmux как альтернатива экрану. Я нахожу его более универсальным и стабильным, чем экран. – Rick James 06.01.2015, 03:28
  • 3
    просто оставив это здесь для дальнейшего использования †“можно удобно работать screen -d -r для восстановления последней сессии. – Raymond Nijland 21.11.2016, 19:41
  • 4
    Или просто screen -dr. Или screen -x, в зависимости от какой you' планирование ре выполнения. Точка, нужно знать то, что делают все те переключатели, так, чтобы можно было использовать соответствующие и не только слепо следовать Интернету people' s предложения. There' s хорошая компактная сводка, доступная здесь: ss64.com/bash/screen.html – Community 28.05.2018, 19:27
  • 5
    Это не ответ на проблему – MLF 16.04.2019, 22:26

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

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

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


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

ClientAliveInterval 600
ClientAliveCountMax 0

Если вы хотите, чтобы ssh клиент автоматически выходил (время ожидания) через 10 минут (600 секунд). [ 1112]

ClientAliveCountMax - указывает общее количество контрольных сообщений, отправленных сервером ssh без получения ответа от клиента ssh. По умолчанию 3.

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


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

0
ответ дан 21.04.2019, 16:12
  • 1
    Установка ServerAliveCountMax выше, чем значение по умолчанию на клиенте должна также помочь сохранить соединение живым для медленных соединений. – Ricky Moreno 02.10.2018, 09:29

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

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

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

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

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

0
ответ дан 21.04.2019, 16:12

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

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

~/.ssh/config

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

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Теперь SSH на ваш сервер и посмотрим, исправлена ​​ли ваша проблема. Параметр ClientAliveInterval полезен только при настройке сервера ssh (он же 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 заключается в том, что сигналы отправляются через зашифрованные каналы, поэтому вероятность их подделки меньше.

0
ответ дан 21.04.2019, 16:12
  • 1
    Это doesn' t работа. Я сталкиваюсь с той же ошибкой снова. – Saharsh Shah 06.10.2013, 18:59
  • 2
    Попробуйте его прямо из командной строки и понизьтесь: ssh-o ServerAliveInterval=5 user@host – anu 07.10.2013, 00:46
  • 3
    Попробованный это также.. doesn' t работа. Я действительно don' t знают то, что продолжает мою систему – Patrick Tucci 15.11.2013, 21:39
  • 4
    It' s ClientAliveCountMax, НЕ ClientAliveMaxCount – starvator 05.09.2015, 14:11
  • 5
    @DavidG отредактируйте ответ со своими исправлениями. – Wang Wen'an 04.02.2016, 05:35

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

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

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

0
ответ дан 21.04.2019, 16:12

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

TCPKeepAlive yes

в

/etc/ssh/ssh_config
0
ответ дан 21.04.2019, 16:12

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

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

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

0
ответ дан 21.04.2019, 16:12
  • 1
    или просто отпуск top выполнение – Salman A 20.12.2013, 11:43

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

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

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

например. Эти функции bash вы можете добавить в свой .bashrc, do_ssh используется вручную для включения keepalive. 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 user@host или do_ssh user@host <args> <command>, и сообщения активности будут активны.

0
ответ дан 21.04.2019, 16:12

Я разместил здесь свой ответ, так как это была не Ubuntu VM.

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

ssh -o IPQoS=throughput user@host
0
ответ дан 21.04.2019, 16:12

Теги

Похожие вопросы