Поиск по сайту:

[Решено] Ошибка сломанного канала при SSH-соединении в Linux


SSH-соединение отключается из-за бездействия? Вот как с этим справиться.

Если вы используете SSH для подключения к удаленным серверам Linux, вы заметите, что если вы оставите сеанс SSH неактивным в течение некоторого времени, а затем попытаетесь использовать его снова, сеанс SSH отключится с сообщением об ошибке, подобным этому:

:client_loop: send disconnect: Broken pipe

В некоторых системах отображается сообщение «Ошибка записи: разорван канал» или «Соединение закрыто удаленным хостом».

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

Исправление ошибки сломанного канала с помощью SSH

Как вы уже догадались, SSH-соединение закрыто из-за неактивности. Установленного значения нет, но обычно оно составляет около 5 минут или около того.

Что вы можете сделать, чтобы избежать отключения сеанса SSH, — это отправить «активное сообщение» либо от сервера клиенту (ClientAliveInterval), либо от клиента к серверу (ServerAliveInterval) по адресу определенный временной интервал.

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

Есть два способа сделать это. Либо вы отправляете активное сообщение с клиента на сервер, либо с сервера клиенту.

  • Если вы подключаетесь к нескольким серверам через SSH, установите его на своем компьютере.

  • Если вы системный администратор и несколько пользователей жалуются на частое отключение SSH-соединения, вы можете установить это на сервере.

Способ 1: изменение конфигурации SSH на стороне клиента

Допустим, вы хотите поддерживать работоспособность SSH-соединения в течение 10 минут (600 секунд) бездействия.

При подключении к удаленной системе Linux через SSH вы можете указать значение ServerAliveInterval следующим образом:

ssh -o ServerAliveInterval=600 username@server_ip_address

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

Надеюсь, вы знаете о файлах конфигурации SSH. На стороне клиента вы можете воспользоваться этим, чтобы установить определенные параметры SSH для определенных соединений или для всех из них. Я подробно объяснил файл конфигурации SSH здесь.

Сначала убедитесь, что у вас есть файл конфигурации ssh. Если нет, создайте его:

touch ~/.ssh/config

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

Используйте команду chmod и добавьте к ней следующие права доступа к файлу:

chmod 600 ~/.ssh/config

Если вам лень или вы не хотите вдаваться в подробности, используйте эту команду, чтобы установить интервал активности на 600 секунд (10 минут):

echo "ServerAliveInterval 600" >> ~/.ssh/config 

Это установит значение ServerAliveInterval равным 10 минутам для всех SSH-соединений, которые вы будете использовать. Попробуйте, если хотите.

Если вы хотите сделать его более правильным, вам следует добавить его следующим образом:

Host *
ServerAliveInterval 600

Способ 2. Изменение конфигурации SSH на стороне сервера.

Файл конфигурации SSH для сервера обычно находится по адресу /etc/ssh/sshd_config.

Если вы откроете этот файл, вы найдете здесь два интересующих параметра:

  • ClientAliveInterval: Это период времени бездействия, по истечении которого сервер отправит активное сообщение клиенту, подключенному по ssh.

  • ClientAliveCountMax: это количество попыток, которые сервер предпримет для отправки активного сообщения.

Скажем, вы установили для ClientAliveInterval значение 200 секунд, а для ClientAliveCountMax значение 3. Это означает, что сервер отправит активное сообщение через 200 секунд. Если со стороны клиента нет активности, он снова отправит активное сообщение через 400 секунд. Никакого ответа/активности от клиента и другое активное сообщение отправляется через 600 секунд. После этого (600 секунд) соединение SSH отключается.

Вы можете редактировать файл /etc/ssh/sshd_config в своем любимом текстовом редакторе на базе терминала, например Vim. Найдите записи ClientAliveInterval и ClientAliveCountMax. Удалите клавишу # в начале строк и присвойте им соответствующее значение.

Сохраните и выйдите из файла.

Пожалуйста, не устанавливайте тайм-аут SSH-соединения на несколько часов. Это было бы пустой тратой ресурсов.

Я надеюсь, что это руководство помогло вам исправить проблему с обрывом канала при подключении по SSH. Ваши отзывы приветствуются.

Статьи по данной тематике: