Как сделать ssh с таймаутом в скрипте?


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

есть идеи, как это сделать?

5 122

5 ответов:

ssh -o ConnectTimeout=10  <hostName>

где 10-время в секундах.

использовать -o ConnectTimeout и -o BatchMode=yes -o StrictHostKeyChecking=no .

ConnectTimeout удерживает скрипт от зависания,BatchMode удерживает его от зависания с неизвестным хостом, да, чтобы добавить к known_hosts, и StrictHostKeyChecking добавляет отпечаток пальца автоматически.

**** Примечание **** "StrictHostKeyChecking" был предназначен только для внутренних сетей, где Вы доверяете своим хостам. В зависимости от версии SSH-клиента, " вы уверены, что хотите добавить ваш отпечаток пальца " может привести к зависанию клиента на неопределенный срок (в основном старые версии, работающие на AIX). Большинство современных версий не страдают от этой проблемы. Если вам приходится иметь дело с отпечатками пальцев с несколькими хостами, я рекомендую поддерживать файл known_hosts с помощью какого-то инструмента управления конфигурацией, такого как puppet/ansible/chef/salt/etc.

попробуйте это:

timeout 5 ssh user@ip

timeout выполняет команду ssh (с args) и отправляет SIGTERM, если ssh не возвращается через 5 секунд. для получения более подробной информации о таймауте, прочитайте этот документ: http://man7.org/linux/man-pages/man1/timeout.1.html

или вы можете использовать параметр ssh:

ssh -o ConnectTimeout=3 user@ip

вы также можете подключиться с флагом

-o ServerAliveInterval=<secs>
таким образом, SSH-клиент будет отправлять нулевой пакет на сервер каждый <secs> секунд, просто чтобы поддерживать соединение. В Linux это также может быть установлено глобально в /etc/ssh/ssh_config или для каждого пользователя в ~/.ssh/config.

Ну, вы можете использовать nohup для запуска того, что вы используете в "неблокирующем режиме". Так что вы можете просто продолжать проверять, если то, что он должен был запустить, побежал, иначе выход.

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh

echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt

поэтому во втором вы просто проверяете, существует ли файл.