Добавить таймаут в порт ping ssh? - PullRequest
0 голосов
/ 20 мая 2018

Я собираюсь использовать приведенный ниже скрипт bash для проверки связи с SSH-портом удаленного хоста, который работает правильно:

(: </dev/tcp/$vm_ip/22) &>/dev/null

Теперь на некоторых хостах эта команда будет очень долго (например, 3 минуты)) сообщать о сбое, когда хост не работает.

Я собираюсь добавить поддержку тайм-аута для этой команды и заставить ее быстро вернуться (например, через 5 секунд), если хост не отвечает.

SSH_CMD="(: </dev/tcp/$vm_ip/22) &>/dev/null"
timeout --preserve-status 5 $SSH_CMD

Тем не менее, приведенное выше выдаст ошибку:

timeout: failed to run command ‘(:’: No such file or directory

Можете ли вы помочь мне, как это исправить?

== РЕДАКТИРОВАТЬ 1 ==================

Попытка изменить код следующим образом (без определения переменной):

timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null

Ошибка:

./test.sh: line 45: syntax error near unexpected token `('
./test.sh: line 45: `   timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null'

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Скобки в вашей команде - это синтаксис оболочки для подоболочки, но timeout не запускает команду, которую она запускает через оболочку.Вместо этого он запускает его напрямую.Он видит (: в качестве имени команды и пытается запустить ее, что приводит к ошибке, поскольку такая команда вряд ли будет в PATH.

. Вам нужно будет добавитьявная оболочка там, с чем-то вроде этого:

timeout --preserve-status 5 bash -c "(: </dev/tcp/$vm_ip/22) &>/dev/null"

Ваша вторая командная строка выдает синтаксическую ошибку, потому что ( и ) являются специальными токенами в оболочке.Эта командная строка также применила бы перенаправления к самому timeout, поэтому сетевое соединение было бы открыто еще до того, как timeout было бы запущено.

Вы могли бы заключить слова в кавычки, то есть timeout ... "(:" и т. Д., Но этовыдаст только тот же результат, что и timeout ... $SSH_CMD.

Я не совсем уверен, что вам все равно нужен подоболочка, но вам все равно нужно запустить оболочку под timeout, чтобы перенаправления обрабатывались, покавремя ожидания истекло.

0 голосов
/ 20 мая 2018

Назовите ваш старый скрипт в вашем новом скрипте так:

timeout --preserve-status 5 name-of-old-script
...