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


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


228
2018-04-28 23:36


Источник


Не важно. Сессия была прервана, и безопасность сеанса была скомпрометирована. Если вы не поставите комп в сон, вы можете установить время ожидания для клиента, чтобы он выстрелил в сердце, чтобы сердце забилось на сервер, но если система собирается спать, то ничего не может быть сделано. - darkdragn
В этом случае я ищу что-то, что позволит мне повторно инициировать сломанное ssh-соединение (основанное, вероятно, на коде выхода), и восстановить с помощью screen? - sorin
Вы ошибаетесь: у меня есть два настольных клиентских компьютера, подключающихся к серверу SAME. Один из них - ubuntu 12.10, Quantal, чей SSH-клиент работает хорошо и поддерживает соединение в течение нескольких часов. Другой - Ubuntu 14.10, Utopic, только в сторону другого и в новой установке; через пару минут он блокирует себя этим сообщением. Остальные сетевые функции в машине не прерываются. Нет, это не проблема сети и проблема с сервером, а конкретная проблема программного обеспечения SSH CLIENT, которая может быть решена, напротив того, что осмеливается сказать, что «ничего не может быть сделано». - David L
И действительно, как я сказал: люди слишком много говорят, когда говорят, что «ничего не может быть сделано», так же, как Дардардн решился. Я прочитал ответ Арама Кочаряна, и я применил его: 20 минут назад ... Я понял, что в моем старом Quantal Ubuntu 12.10 я применил эту инструкцию в этом файле [я только что проверил] два года назад, и это было причина стабильности там. Я сделал это здесь, и за последние 20 минут связь была стабильной с тех пор. Поэтому, пожалуйста, люди: воздержитесь от себя, смея думать, что «ничего не может быть сделано», и воздерживаться еще больше, пытаясь оставить это сообщение другим людям. - David L
@DavidL вы должны прочитать вопросы лучше, прежде чем разглагольствовать. Ваша проблема не такая же, как у OP, которая явно упоминает, что компьютер переспал. Который кстати только один из ответов адресовал («мош»), и он был опубликован через 2 года после вопроса. Однако другие ответы делают следующее лучшее, что предлагает решения для случаев, которые могут быть решены более легко, как и ваши. Ошеломляй, не будьте так напряженными, разглагольствования здесь не приносит пользы ... - msb


Ответы:


Я пробовал это в /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,


208
2018-05-26 11:49



Да, я делаю подобное, и это работает очень хорошо для большинства вещей. - Oli♦
Я не на Mac, но Ubuntu 12.04 и файл для этой операционной системы также кажется ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 дает ошибку Bad configuration option: ClientAliveInterval - ohho
Я получаю то же самое Bad configuration option ошибка в OSX 10.8.4. - Nick Heiner
Как правило, вы помещаете эти две команды в разные части системы. Только ServerAliveInterval на стороне клиента OSX ... и только ClientAliveInterval в файле конфигурации sshd ... - ftrotter


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

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


70
2017-10-04 16:28



Вероятно, это лучший ответ, я не уверен, почему он не проголосовал выше. Другие «исправления» полезны в специальном случае, когда вы действительно заботитесь о поддержке SSH-соединения, но в большинстве случаев я считаю, что реальная проблема заключается в том, что предполагаемые процессы продолжают выполняться независимо от каких-либо проблем с подключением к клиенту и серверу , - Paul McMurdie
Я бы также добавил Tmux как альтернатива экрану. Я нахожу его более универсальным и стабильным, чем экран. - fridaymeetssunday
просто оставив это здесь для дальнейшего использования - вы можете удобно запустить screen -d -r для восстановления вашей последней сессии. - doplumi
Или просто screen -dr, Или screen -x в зависимости от того, что вы планируете делать. Дело в том, что нужно знать, что делают все эти коммутаторы, чтобы можно было использовать соответствующие, а не просто слепо следовать предложениям интернет-пользователей. Здесь есть приятное компактное резюме: ss64.com/bash/screen.html - flith


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

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

~/.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 заключается в том, что сигналы отправляются через зашифрованные каналы, поэтому он менее вероятно, будет подделать.


39
2017-10-06 02:54



Это не работает. Я снова сталкиваюсь с такой же ошибкой. - user997704
Попробуйте прямо из командной строки и опустите: ssh -o ServerAliveInterval = 5 user @ host - Matt
Пробовал тоже ... не работает. Я действительно не знаю, что происходит с моей системой - user997704
Это ClientAliveCountMax, а не ClientAliveMaxCount - David G
@DavidG Пожалуйста, отредактируйте ответ с исправлениями. - CivMeierFan


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

TCPKeepAlive yes

в

/etc/ssh/ssh_config

21
2017-10-07 18:40





Для клиента измените свой ~/.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-клиент завершил (таймаут) автоматически через 10 минут (600 секунд).

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

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


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


18
2017-10-02 13:52





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

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

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

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

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


15
2017-09-30 18:48





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

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

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


4
2017-07-30 13:33





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

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

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


3
2017-09-09 16:50



или просто уйти top Бег - Eben Geer