Я подключаюсь к CentOS 5.5 через SSH с компьютера с Ubuntu 11.04.
Соединение, кажется, работает должным образом, когда оно находится в активном использовании (то есть без задержки или потери), но если оно какое-то время остается неактивным, оно зависает и перестает отвечать на запросы. В конце концов будет возвращено сообщение об ошибке «Ошибка записи: сломанная труба», и я вернусь к приглашению моей локальной машины.
Что я могу сделать, чтобы помочь отладить это, выяснить, что происходит, и решить эту проблему? Будучи разработчиком, это делает мою жизнь болью от необходимости постоянно подключаться.
man sshd_config
.Фактический ответ почти всегда состоит в том, что у вас есть какое-то устройство NAT на пути, обычно брандмауэр, таблицы состояний которого имеют довольно агрессивный тайм-аут. Поскольку вы оставляете ваше ssh-соединение бездействующим в течение нескольких периодов времени, устройство NAT «забывает» сопоставление между вашим внутренним адресом и номером порта источника, и вашим эфемерным внешним NATted адресом и номером порта.
Когда вы позже попытаетесь что-то сделать в этом окне ssh, вам будет назначена новая эфемерная пара адрес / порт, о которой целевой сервер ssh не знает и не отвечает; позже достигается некоторое локальное время ожидания, и соединение прерывается на вашей локальной машине.
Практическое решение этой проблемы заключается в том, чтобы сделать именно то, что предлагает yuriismaster: включить KeepAlives (которые гарантируют регулярный трафик для «перетаскивания» этой записи таблицы состояний) и использовать
screen
на удаленной стороне (чтобы сохранить состояние в случае, если что-то будет сброшено). Я публикую этот ответ только потому, что вы спросили, что происходит, и что с этим делать. Надеюсь, это проясняет, почему предложения yuriismaster являются хорошими.источник