Что можно сделать, чтобы настроить SSH на клиенте и на серверах, чтобы предотвратить ошибки Write Failed: broken pipe
? Это часто происходит, если вы спите на своем клиентском компьютере и возобновите работу позже.
Я пытался сделать это в /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
.
Сессии SSH могут прерваться из-за многочисленных и, возможно, неизбежных причин.
Полезная утилита, которая может быть использована для смягчения проблем, вызванных этим, называется screen
. Screen - мощная утилита, которая позволяет вам управлять несколькими терминалами, которые будут работать независимо от сеанса ssh. Например, если вы запустите screen
в сеансе ssh, вы увидите, что новый терминал открыт, и вы можете использовать его для запуска заданий. Допустим, ваша сессия SSH умирает в процессе. Выполнение screen -d
, затем screen -r
откроет последнюю сессию, и вы сможете продолжить с нее. Обязательно прочитайте часть документации перед ее использованием.
screen -d -r
для восстановления последней сессии.
– Raymond Nijland
21.11.2016, 19:41
screen -dr
. Или screen -x
, в зависимости от какой you' планирование ре выполнения. Точка, нужно знать то, что делают все те переключатели, так, чтобы можно было использовать соответствующие и не только слепо следовать Интернету people' s предложения. There' s хорошая компактная сводка, доступная здесь: ss64.com/bash/screen.html
– Community
28.05.2018, 19:27
Для клиента отредактируйте файл ~/.ssh/config
(или /etc/ssh/ssh_config
) следующим образом:
Host *
TCPKeepAlive yes
ServerAliveInterval 120
TCPKeepAlive - указывает, должна ли система отправлять протокол активности TCP сообщения на другую сторону. Если они отправлены, смерть соединения или сбой одной из машин будут замечены должным образом. Однако это означает, что соединения прервутся, если маршрут временно не работает, и некоторые люди считают это раздражающим (по умолчанию «да»).
ServerAliveInterval - Устанавливает интервал времени в секундах, после которого, если от сервера не было получено никаких данных, ssh (1) отправит сообщение через зашифрованный канал, чтобы запросить ответ от сервера. По умолчанию 0, что означает, что эти сообщения не будут отправлены на сервер.
blockquote>
Для сервера отредактируйте ваш
/etc/ssh/sshd_config
как:ClientAliveInterval 600 ClientAliveCountMax 0
Если вы хотите, чтобы ssh клиент автоматически выходил (время ожидания) через 10 минут (600 секунд). [ 1112]
ClientAliveCountMax - указывает общее количество контрольных сообщений, отправленных сервером ssh без получения ответа от клиента ssh. По умолчанию 3.
ClientAliveInterval - указывает время ожидания в секундах. Через x секунд ssh-сервер отправит клиенту сообщение с просьбой ответить. Значение по умолчанию - 0 (сервер не отправляет сообщение клиенту для проверки.)
blockquote>
См. также: Что именно делают опции
ServerAliveInterval
иClientAliveInterval
в sshd_config?
Я очень люблю Моша. Я часто захожу на сервер, закрываю свой ноутбук и иду в кафе, открываю его и продолжаю, как будто ничего не изменилось.
Mosh (мобильная оболочка)
Приложение удаленного терминала, которое позволяет роуминг , поддерживает прерывистое соединение и обеспечивает интеллектуальное [ 113] локальное эхо и линейное редактирование нажатий клавиш пользователя.
Mosh - замена SSH. Он более надежный и отзывчивый, особенно по Wi-Fi, сотовой связи и междугородной связи.
Mosh - бесплатное программное обеспечение, доступное для GNU / Linux, FreeBSD, Solaris, Mac OS X и Android.
BLOCKQUOTE>
Конфигурация клиента
Попробуйте создать файл:
~/.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 заключается в том, что сигналы отправляются через зашифрованные каналы, поэтому вероятность их подделки меньше.
Для меня я получал Write failed: Broken pipe
, даже когда активно печатал в vim или в приглашении оболочки. Я тоже не мог просматривать интернет локально некоторое время. (Я подключался удаленно к Ubuntu с помощью Terminal.)
Другие участники моей сети транслируют много видео из Netflix и других мест. Я не могу доказать это, но я подозреваю, что это проблема с интернет-провайдером или маршрутизатором. Например, Verizon и Netflix указывают пальцем друг на друга из-за сетевых проблем своих клиентов.
Если у вас есть подключение удаленного доступа и потоковое видео или музыка с одновременным подключением через SSH или telnet, в какой-то момент вы неизбежно получите сообщение о разрыве канала. Модернизация широкополосного пакета моего интернет-провайдера, казалось, делала мое разорванное соединение менее частым.
Я удаленно обновляю сервер Ubuntu с lucid до точного и теряю соединение ssh в середине обновления с сообщением «Ошибка записи. Brocken pipe». ClientAliveInterval и ServerAliveInterval ничего не сделали. Решение состоит в том, чтобы включить опции TCPKeepAlive в клиенте ssh:
TCPKeepAlive yes
в
/etc/ssh/ssh_config
У меня есть скрипт на удаленном сервере, который никогда не выходит из строя, независимо от клиента или сервера конфигурации SSH.
#!/bin/bash
while true; do date; sleep 10; done;
Сохраните его в некотором файле dummy.sh и быстро запустите, прежде чем свернуть окно или отойти от него. Он будет продолжать печатать текущую метку времени на сервере и поддерживать ваше соединение в активном состоянии до тех пор, пока соединение не будет прервано по какой-либо другой причине. Когда вы вернетесь к этому терминалу, просто нажмите CTRL + C и продолжайте работать.
Вы можете добавлять эти аргументы каждый раз, когда вызываете 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>
, и сообщения активности будут активны.
Я разместил здесь свой ответ, так как это была не Ubuntu VM.
ssh -o IPQoS=throughput user@host
Bad configuration option: ClientAliveInterval
– tiomno 15.07.2013, 18:46Bad configuration option
ошибка на OSX 10.8.4. – Salman A 19.07.2013, 09:57