Иногда моему ssh-клиенту требуется вечность для входа в систему.
Это происходит, когда сервер не отвечает (перегружен, завершен, обработан, ...). Тогда мои автоматические скрипты не сработают, потому что процесс ssh никогда не завершится.
Есть ли значение конфигурации ssh для установки тайм-аута для сбоя, если ssh не может войти в систему через предопределенное количество секунд?
Я знаю, что на стороне сервера есть регуляторы, но я должен установить это на стороне клиента, поскольку процесс sshd не отвечает или отвечает неправильно.
Спасибо!
Я видел случаи, когда даже установка ConnectTimeout не работала. Это может быть особенно неприятно при использовании автоматических ssh-соединений с большим количеством серверов. Мое решение - использовать оболочку на стороне клиента, которая убивает процесс ssh, если он не подключается и не возвращается достаточно быстро. Примерно так (на perl):
$SshCmd = "ssh server.example.com uname -a";
$TimeOut = 120;
eval {
local $SIG{ALRM} =
sub {
# ignore SIGHUP here so the kill only affects children.
local $SIG{HUP} = 'IGNORE';
kill 1,(-$$);
print STDERR "ssh terminated, max run time of $TimeOut seconds exceeded.\n";
};
alarm $TimeOut;
system ($SshCmd) || die "failed to run $SshCmd: $!";
alarm 0;
};
$SIG{HUP} = 'DEFAULT';
Это вызывает тревогу $TimeOut
секунд, и убивает ребенка (команда ssh), если сигнал тревоги превышен.
У меня была такая же проблема, и я использовал «тайм-аут» Linux, чтобы убить зависающий сеанс scp.
timeout -s 9 1h command command_arguments
Отправит kill -9, если команда займет больше часа.
К вашему сведению, опция ConnectTimeout у меня не сработала.
Установите ConnectTimeout в .ssh / config, если используете ssh (из OpenSSH).
ConnectTimeout
Задает тайм-аут (в секундах), используемый при подключении к ssh-серверу, вместо использования системного тайм-аута TCP по умолчанию. Это значение используется только тогда, когда цель отключена или действительно недоступна, а не когда она отказывается от соединения.
Попробуйте установить UseDNS no в sshd_config.