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

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

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

Ответ 1

ssh -o ConnectTimeout=10  <hostName>

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

Ответ 2

Используйте -o ConnectTimeout и -o BatchMode=yes -o StrictHostKeyChecking=no.

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

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

Ответ 3

попробуйте следующее:

timeout 5 ssh [email protected]

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

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

ssh -o ConnectTimeout=3 [email protected]

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Если все остальное терпит неудачу (включая отсутствие команды 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

Ответ 7

как использовать эту команду в цикле

set timeout -1