Подключение SSH к серверу AWS ec2 ubuntu: сбой записи: сломанная труба [dубликат]

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

235
задан 25 February 2015 в 19:50

18 ответов

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

207
ответ дан 17 July 2018 в 22:37

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

207
ответ дан 24 July 2018 в 13:13

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

TCPKeepAlive yes

в

/etc/ssh/ssh_config
21
ответ дан 17 July 2018 в 22:37

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

Host * TCPKeepAlive yes ServerAliveInterval 120 TCPKeepAlive - указывает, должна ли система отправлять сообщения keepalive TCP на другую сторону. Если они будут отправлены, смерть соединения или сбой одной из машин будет правильно замечена. Однако это означает, что соединения будут умирать, если маршрут временно остановлен, а некоторые люди находят его раздражающим (по умолчанию «да»). ServerAliveInterval - устанавливает интервал времени ожидания в секундах, после которого, если данные не были получены с сервера, ssh (1) отправит сообщение через зашифрованный канал, чтобы запросить ответ от сервера. Значение по умолчанию равно 0, что указывает на то, что эти сообщения не будут отправляться на сервер.

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

ClientAliveInterval 600 ClientAliveCountMax 0

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

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

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

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

17
ответ дан 17 July 2018 в 22:37

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

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

~/.ssh/config

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

Host * ServerAliveInterval 30 ServerAliveCountMax 5

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

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

37
ответ дан 17 July 2018 в 22:37

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

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

69
ответ дан 17 July 2018 в 22:37

Вы можете добавлять эти аргументы каждый раз при вызове 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 user@host или do_ssh user@host <args> <command>, а keepalives будут активны.

0
ответ дан 17 July 2018 в 22:37

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

Мош (мобильная оболочка) Приложение удаленного терминала, которое позволяет роуминг, поддерживает прерывистую связь, и обеспечивает интеллектуальное локальное эхо и редактирование строк пользовательских нажатий клавиш. Мош является заменой SSH. Он более надежный и отзывчивый, особенно по Wi-Fi, сотовой и междугородной связью. Мош - бесплатное программное обеспечение, доступное для GNU / Linux, FreeBSD, Solaris, Mac OS X и Android.
15
ответ дан 17 July 2018 в 22:37

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

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

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

3
ответ дан 17 July 2018 в 22:37

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

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

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

4
ответ дан 17 July 2018 в 22:37

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

TCPKeepAlive yes

в

/etc/ssh/ssh_config
21
ответ дан 24 July 2018 в 13:13

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

Host * TCPKeepAlive yes ServerAliveInterval 120 TCPKeepAlive - указывает, должна ли система отправлять сообщения keepalive TCP на другую сторону. Если они будут отправлены, смерть соединения или сбой одной из машин будет правильно замечена. Однако это означает, что соединения будут умирать, если маршрут временно остановлен, а некоторые люди находят его раздражающим (по умолчанию «да»). ServerAliveInterval - устанавливает интервал времени ожидания в секундах, после которого, если данные не были получены с сервера, ssh (1) отправит сообщение через зашифрованный канал, чтобы запросить ответ от сервера. Значение по умолчанию равно 0, что указывает на то, что эти сообщения не будут отправляться на сервер.

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

ClientAliveInterval 600 ClientAliveCountMax 0

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

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

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

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

17
ответ дан 24 July 2018 в 13:13

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

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

~/.ssh/config

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

Host * ServerAliveInterval 30 ServerAliveCountMax 5

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

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

37
ответ дан 24 July 2018 в 13:13
  • 1
    Это не работает. Я снова сталкиваюсь с такой же ошибкой. – user997704 6 October 2013 в 09:59
  • 2
    Попробуйте прямо из командной строки и опустите: ssh -o ServerAliveInterval = 5 user @ host – Matt 6 October 2013 в 15:46
  • 3
    Пробовал тоже ... не работает. Я действительно не знаю, что происходит с моей системой – user997704 15 November 2013 в 14:39
  • 4
    Это ClientAliveCountMax, а не ClientAliveMaxCount – David G 5 September 2015 в 04:11
  • 5
    @DavidG Пожалуйста, отредактируйте ответ с исправлениями. – CivMeierFan 3 February 2016 в 21:35

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

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

69
ответ дан 24 July 2018 в 13:13
  • 1
    Вероятно, это лучший ответ, я не уверен, почему он не проголосовал выше. Другие "исправления" полезны в специальном случае, когда вам действительно нужно поддерживать соединение SSH, но в большинстве случаев я считаю, что реальная проблема заключается в том, что предполагаемые процессы продолжают выполняться независимо от каких-либо проблем с подключением к клиенту и серверу. – Paul McMurdie 3 June 2013 в 22:33
  • 2
    Я также добавил бы Tmux в качестве альтернативы экрану. Я нахожу его более универсальным и стабильным, чем экран. – fridaymeetssunday 5 January 2015 в 19:28
  • 3
    просто оставив это здесь для дальнейшего использования - вы можете удобно запустить screen -d -r, чтобы восстановить свой последний сеанс. – doplumi 21 November 2016 в 11:41
  • 4
    Или просто screen -dr. Или screen -x в зависимости от того, что вы планируете делать. Дело в том, что нужно знать, что делают все эти коммутаторы, чтобы можно было использовать соответствующие, а не просто слепо следовать предложениям интернет-пользователей. Здесь есть приятное компактное резюме: ss64.com/bash/screen.html – flith 28 May 2018 в 09:27

Вы можете добавлять эти аргументы каждый раз при вызове 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 user@host или do_ssh user@host <args> <command>, а keepalives будут активны.

0
ответ дан 24 July 2018 в 13:13

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

Мош (мобильная оболочка) Приложение удаленного терминала, которое позволяет роуминг, поддерживает прерывистую связь, и обеспечивает интеллектуальное локальное эхо и редактирование строк пользовательских нажатий клавиш. Мош является заменой SSH. Он более надежный и отзывчивый, особенно по Wi-Fi, сотовой и междугородной связью. Мош - бесплатное программное обеспечение, доступное для GNU / Linux, FreeBSD, Solaris, Mac OS X и Android.
15
ответ дан 24 July 2018 в 13:13

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

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

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

3
ответ дан 24 July 2018 в 13:13

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

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

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

4
ответ дан 24 July 2018 в 13:13

Другие вопросы по тегам:

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