[Решено] Ошибка сломанного канала при 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. Ваши отзывы приветствуются.