При подключении к некорректно работающему SSH-серверу есть ли флаг или настройка конфигурации, которые я могу использовать, чтобы сообщить клиенту о необходимости прекратить соединение раньше, если интерактивная консоль не будет достигнута в течение короткого периода времени?
Я знаю, -o ConnectTimeout
что это прервет соединение, когда хост недоступен. В этом случае хост доступен и первоначальное соединение происходит быстро («Сервер принимает ключ» менее чем за 1 секунду), но затем сбой на каком-то уровне PAM означает, что я могу получить фактическую командную строку через 3 секунды, 12 секунд или никогда. Соединение зависает, пока я не отправлю Ctrl+C или не подожду 90 секунд, пока не будет выдано сообщение «Connection to [host] port 22 timed out»
Пока не устранена основная причина (которую я не собираюсь решать этим вопросом), могу ли я что-то сделать, чтобы смягчить симптом? Я хочу автоматически отключаться, если мы не попадаем на полезную подсказку в течение 5 секунд.
решение1
Если базовое соединение стабильно и наша главная цель — открыть несколько сеансов, не играя в PAM-рулетку, может помочь режим «master»:
ssh -M -S /tmp/reusable.sock user@host
После того, как вы впервые победите в битве Ctrl+C/90-секундный тайм-аут, другие терминалы можно будет быстро открыть с помощью:
ssh -S /tmp/reusable.sock user@host
Это работает до тех пор, пока исходное соединение остается открытым. Сокращение времени соединения предполагает, что проблема находится на этапе аутентификации (поскольку мультиплексирование сокета таким образом обходит повторную аутентификацию)
решение2
Если соединение зависает до настройки переадресации портов, мы можем использовать сокет в качестве семафора и создать собственный сторожевой таймер:
lfg.sh:
#!/bin/bash
set -m
function watchdog {
sleep $1
if [[ ! -S "/tmp/lfg.$2" ]]; then
kill -STOP $3
fi
}
ssh -L /tmp/lfg.$$:localhost:1234 $1 && rm -f /tmp/lfg.$$ &
watchdog $2 $$ $! &
fg %-
Использование:
lfg grumpy-host 5
lfg
сначала включает управление заданиями, затем инициирует ssh
запрос локального сокета /tmp/lfg.nnn
, перенаправленного на произвольный удаленный порт. Помещая это задание в фоновый режим, мы просим функцию watchdog подождать 5 секунд, а затем искать сокет. Если его там нет, завершаем остановившийся процесс ssh. fg %-
возвращает ssh на передний план, так что как только он станет интерактивным, мы в деле; если это займет больше 5 секунд, мы вернемся к нашему локальному приглашению.