Как сделать ssh с таймаутом в скрипте?
Я выполняю скрипт подключения через SSH без пароля на удаленном хосте. Я хочу установить тайм-аут, так что если удаленный хост занимает бесконечное время для запуска, я хочу выйти из этого сеанса ssh и продолжить другие строки в моем SH-скрипте.
есть идеи, как это сделать?
5 ответов:
использовать
-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.shecho "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txtпоэтому во втором вы просто проверяете, существует ли файл.