Как сделать SSH с таймаутом в скрипте? - PullRequest
142 голосов
/ 08 февраля 2011

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

Ответы [ 6 ]

247 голосов
/ 10 марта 2011
ssh -o ConnectTimeout=10  <hostName>

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

99 голосов
/ 01 июля 2012

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

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

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

40 голосов
/ 04 сентября 2015

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

timeout 5 ssh user@ip

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

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

ssh -o ConnectTimeout=3 user@ip
15 голосов
/ 16 марта 2015

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

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

Если ничего не помогает (включая отсутствие команды timeout), концепция в этом сценарии оболочки будет работать:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi
0 голосов
/ 08 февраля 2011

Ну, вы могли бы использовать 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

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

...