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

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

346
задан 25 February 2015 в 18:50

10 ответов

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

319
ответ дан 25 February 2015 в 18:50

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

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

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

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

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

18
ответ дан 25 February 2015 в 18:50

Client configuration

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

~/.ssh/config

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

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

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

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

Using an SSH Config File

For more information on other options. Возможно, вы не захотите применять эту опцию к каждому серверу, к которому вы подключитесь в этом примере. Или ограничьте его только для конкретного сервера, заменив строку Host * на Host (замените на IP-адрес, смотрите страницу руководства ssh_config).

Server configuration

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

ClientAliveInterval 20
ClientAliveCountMax 5

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

56
ответ дан 25 February 2015 в 18:50

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

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

102
ответ дан 25 February 2015 в 18:50

Для клиента отредактируйте файл ~ / .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 - указывает время ожидания в секундах. После х количество секунд, ssh-сервер отправит клиенту сообщение с запросом для ответа. Deafult - 0 (сервер не будет отправлять сообщение клиенту на проверьте.).


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

23
ответ дан 25 February 2015 в 18:50

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

TCPKeepAlive yes

in

/etc/ssh/ssh_config

Надеюсь, это поможет

30
ответ дан 25 February 2015 в 18:50

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

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

ssh -o IPQoS=throughput user@host
4
ответ дан 25 February 2015 в 18:50

Для меня я получал Ошибка записи: сломана труба , даже когда я активно набирал в vim или в командной строке. Я тоже какое-то время не мог выходить в Интернет локально. (Я удаленно подключался к Ubuntu с помощью терминала.)

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

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

6
ответ дан 25 February 2015 в 18:50

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

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

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

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

1
ответ дан 25 February 2015 в 18:50

Man attālajā serverī ir skripts, kas, šķiet, nekad neizdodas, neatkarīgi no SSH konfigurācijas klienta vai servera.

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

Saglabājiet to kādā dummy.sh failā un ātri palaidiet to pirms loga samazināšanas vai attālināšanas no tā. Tas turpinās drukāt pašreizējo laika zīmogu uz servera un uzturēs jūsu savienojumu dzīvu, kamēr savienojums netiek pārtraukts kāda cita iemesla dēļ. Atgriežoties pie šī termināļa, vienkārši nospiediet CTRL + C un turpiniet strādāt.

3
ответ дан 25 February 2015 в 18:50