какие опции `serveraliveinterval` и` clientaliveinterval` в sshd\_config точно делают?

<p>я нашел <a href="https://unix.stackexchange.com/questions/2010/what-does-the-broken-pipe-message-mean-in-an-ssh-session">этот вопрос</a> , но извините, я не совсем понимаю настройки двух переменных: <code>serveraliveinterval</code> и <code>clientaliveinterval</code>, упомянутых в принятом ответе. если у моего локального сервера истекло время ожидания, должен ли я установить это значение на ноль? это тогда никогда не истечет? должен ли я вместо этого установить его на 300 секунд или что-то?</p><p>мой вопрос прост: некоторые из моих подключений перестают работать, когда я приостанавливаю, а затем отключаю свой ноутбук с ответом <code>write failed: broken pipe</code> а некоторые нет. как я могу правильно настроить локальный sshd, чтобы они не перестали работать со сломанным каналом?</p>

<p> <a href="http://man.openbsd.org/ssh\_config#serveraliveinterval">serveraliveinterval</a> : количество секунд, в течение которых <strong> клиент </strong> будет ожидать перед отправкой на сервер пустого пакета (чтобы поддерживать соединение) ,.</p><p> <a href="http://man.openbsd.org/sshd\_config#clientaliveinterval">clientaliveinterval</a> : количество секунд, в течение которых <strong> сервер </strong> будет ожидать перед отправкой нулевого пакета клиенту (чтобы поддерживать соединение активным) ,.</p><p>установка значения 0 (по умолчанию) отключит эти функции, поэтому ваше соединение может разорваться, если оно простаивает слишком долго.</p><p>serveraliveinterval, по-видимому, является наиболее распространенной стратегией поддержания соединения. чтобы предотвратить проблему со сломанным каналом, вот конфигурация ssh, которую я использую в своем файле .ssh/config:</p><pre><code>host myhostshortcut hostname myhost.com user barthelemy serveraliveinterval 60 serveralivecountmax 10 </code></pre><p>вышеуказанная настройка будет работать следующим образом,</p><ol> <li>клиент будет бездействовать в течение 60 секунд (время serveraliveinterval) и отправить серверу "пустой пакет" и ожидать ответа. если ответ не приходит, он будет пытаться выполнить описанный выше процесс до 10 раз (serveralivecountmax) (600 секунд). если сервер по-прежнему не отвечает, клиент отключает соединение ssh.</li> </ol><p>clientalivecountmax на стороне сервера также может помочь. это предел того, как долго клиент может оставаться без ответа до отключения. значение по умолчанию равно 3, как в трех clientaliveinterval.</p>

<p>это объясняется в <a href="https://linux.die.net/man/5/sshd\_config"><code>sshd\_config</code> руководство</a> (<code>man sshd\_config</code>):</p><blockquote> <p><strong> <code>clientaliveinterval</code> </strong></p> <p>устанавливает интервал ожидания в секундах, после которого, если от клиента не было получено никаких данных, sshd отправит сообщение через зашифрованный канал для запроса ответа от клиента. <strong> по умолчанию 0, что означает, что эти сообщения не будут отправлены клиенту. </strong> этот параметр применяется только к версии протокола 2.</p> <p><strong> <code>clientalivecountmax</code> </strong></p> <p>значение по умолчанию - 3. если для <code>clientaliveinterval</code> (см. ниже) установлено значение 15, а для параметра <code>clientalivecountmax</code> оставлено значение по умолчанию, неотвечающие клиенты ssh будут отключены примерно через 45 секунд. эта опция применяется только к версии протокола 2.</p> </blockquote><p>параметры клиента см. в объяснении в <code>man ssh\_config</code>:</p><blockquote> <p><strong> <code>serveraliveinterval</code> </strong></p> <p>устанавливает интервал ожидания в секундах, после которого, если от сервера не было получено никаких данных, <code>ssh</code> отправит сообщение через зашифрованный канал для запроса ответа от сервера. <strong> по умолчанию 0, что означает, что эти сообщения не будут отправлены на сервер. </strong> этот параметр применяется только к версии протокола 2.</p> <p><strong> <code>serveralivecountmax</code> </strong></p> <p>значение по умолчанию - 3. если, например, <code>serveraliveinterval</code> установлено на 15 и <code>serveralivecountmax</code> оставлено по умолчанию, если сервер перестает отвечать на запросы, <code>ssh</code> отключится примерно через 45 секунд эта опция применяется только к версии протокола 2.</p> </blockquote><p>на основании выше, 0 означает, что он отключен. поэтому вы должны установить эти значения достаточно высоко, чтобы избежать ошибки <em> broken pipe</em>.</p>

<p>ответ от бартелеми классный, но в действительности не доходит до корня проблемы. вы приостанавливаете работу своего компьютера и хотите, чтобы сеанс ssh оставался активным при загрузке компьютера.</p><p>для ssh нет такой конфигурации, которая бы поддерживала такое соединение. ssh использует tcp, для начала вам нужно трехстороннее рукопожатие, а затем сохранить его после некоторого простоя. когда вы закрываете/переводите в спящий режим все ваши tcp соединения закрываются с помощью fin. нет способа преодолеть это.</p><p>для грязного обходного пути вы можете использовать vps или другую онлайн-коробку с экраном, чтобы сохранить соединение. мой совет не делайте этого по соображениям безопасности.</p>

<p>поскольку вы не можете гарантировать, что ssh-соединение (то есть tcp) останется живым, как только один конец перестанет отправлять ack на полученные пакеты, я лично использую <a href="http://www.harding.motd.ca/autossh/">http://www.harding.motd.ca/autossh/</a> = перезапустить все мои ssh-соединения почти сразу же, как я перестал работать.</p><p>поскольку gnu экран будет использоваться на стороне сервера, повторное присоединение возвращает меня туда, где я был раньше.</p><p>вы можете прослушивать дополнительные порты, чтобы он постоянно проверял, что соединения все еще живы, но лично я считаю, что он достаточно хорошо работает с отключенным и просто полагается на собственный <code>serveraliveinterval</code>/<code>serveralivecountmax</code> ssh.</p><p>другой вариант <a href="http://mosh.mit.edu/">http://mosh.mit.edu/</a> , который использует udp и без проблем восстанавливается после длительного отсутствия соединения.</p>

<p>вы также можете запускать команды с <code>nohup</code>, если хотите, чтобы они выполнялись независимо от вашего ssh-соединения.</p><p>например.</p><p><code>$ nohup tar -xzf some\_huge.tar.gz &</code></p><p><code>&</code>, я думаю, не является необходимым, но это удобно, поскольку он запускает процесс в фоновом режиме, что позволяет выполнять другие действия.</p><p>я всегда использую nohup для любого процесса, который занимает некоторое время, так что мне не нужно начинать сначала, если я потеряю соединение по какой-либо причине - отключение питания (в моем удаленном местоположении, а не на хосте, очевидно), отключение сети, что угодно.</p>

<p>поместите ваш длительный сеанс в экран. смотрите screen -h для деталей</p><p>таким образом, вы можете переподключиться к машине с помощью ssh и подключиться к экранной сессии</p>