3

Попытка запустить скрипт, который подтверждает установку даты на большом количестве серверов в локальной сети. Все серверы локальны, и, если они исправны, я ожидаю, что время отклика <1 секунды. Чтобы скрипт работал с полезной скоростью, я хочу, чтобы время ожидания соединения было как можно меньше.

Поэтому я пробую это как мой основной тест в цикле. (IP-адрес будет переменным)

ssh -v -o ConnectTimeout=1 -o ConnectionAttempts=1 10.x.x.x date

Для здоровых серверов это работает нормально, но я вижу некоторые окна, которые зависают и, кажется, игнорируют значения Timeout. Зависание от 1 до 2 минут, а не 1 секунды, которую я ожидаю. Подробный вывод выглядит следующим образом.

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /root/.ssh/config
debug1: Applying options for *10.x.x.x*
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to *10.x.x.x* [*10.x.x.x*] port 22.
debug1: fd 3 clearing O_NONBLOCK
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/aws_rsa type -1
debug1: identity file /root/.ssh/aws_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP

(вот где сидит в течение одной-двух минут)

Connection to *10.x.x.x* timed out while waiting to read

Одна деталь, на которую я обращаю внимание, это то, что существует какое-то соединение, которое происходит, но это неудачное соединение. Сервер не работает и не отвечает ожидаемым образом. Есть ли другой вариант, который я могу выбрать, который обнаружил бы это и провалился бы быстрее, когда есть проблема с протоколом?

1 ответ1

2

Со страницы руководства для ssh_config:

ConnectTimeout

Указывает время ожидания (в секундах), используемое при подключении к серверу SSH, вместо того, чтобы использовать системное время ожидания TCP по умолчанию. Это значение используется только тогда, когда цель недоступна или действительно недоступна, а не когда она отказывается от соединения.

Это может быть не совсем ясно из этих строк, но время ожидания используется только для системного вызова connect() , в основном перед строкой

debug1: Connection established.

и не для каждого другого ответа от сервера. Для этого есть параметр ServerAliveInterval который ping с сервером через каждый Х секунд , чтобы убедиться , что сервер отвечает после подключения (по умолчанию выключено). Но вы попадаете в тот случай, когда истекает время вашего TCPKeepAlive , что является еще одной главой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .