web-dev-qa-db-ja.com

成功するまでsshコマンドを実行する方法は?

デバイスを再起動して、準備ができたらsshに戻る必要がある場合があります。

コマンドが成功するまで5秒ごとにsshコマンドを実行したいと思います。

私の最初の試み:

watch -n5 ssh [email protected] && exit 1

これどうやってするの?

31

別のオプションは、untilを使用することです。

until ssh [email protected]; do
    sleep 5
done

複数のホストに対してこれを繰り返し行う場合は、~/.bashrcの関数に入れます。

repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}
33
ssh [email protected]
until !!; do sleep 5 ; done

!!は、最後のコマンドを繰り返します。

18
GAD3R

OpenSSHには、ほぼ必要なことを行うConnectionAttempts設定があります。デフォルトは1ですが、ssh_configまたはコマンドラインで変更できます。

ssh -o 'ConnectionAttempts 10' ...

残念ながら、1秒に固定されている試行間隔は調整できませんが、同じ方法で接続試行タイムアウトConnectTimeout(秒単位)を調整できます。

17
David Foerster
while ! ssh [email protected] true; do
    sleep 5
done; echo "Host is back up at $(date)!"
14
DopeGhoti

autosshは、sshセッションを存続させます。適切なパラメータを使用すると、現在接続することが不可能で、成功するまで試行することもできます。これは正常に機能しますが、re connectパーツをインタラクティブセッションでうまく機能させるには、screenまたは同等のものと組み合わせる必要があります。

私はこれをお勧めします:

AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@Host

ただし、詳細についてはそのmanページを参照してください。上記のパラメータを使用すると、autosshAUTOSSH_POLL秒ごとにsshを起動しようとします。AUTOSSH_GATETIME=0は、最初の試行が失敗した場合に再試行します(間違いなく希望どおり)、-M 0 autosshによる接続チェックを無効にします。それ以降のオプションはすべてsshに渡されます。 2つの-oオプションは、接続が5秒を超えてドロップした場合にsshを終了させます。

4
Nobody

答えにコードを投げるだけのリスクがあるので、このスクリプトは私にとって日常的に機能します。私はそれをresshと呼び、ressh {hostname}と同じように、または注意してressh -S {session_name} {hostname}として使用できます。

#!/bin/bash
#
# Repeatedly attempt to reconnect to a remote ssh server
########################################################################
#
prefix="${0/*\/}"
port=
session=
action=ssh              # How to connect remotely

while getopts 'l:Lp:P:S:' OPT
do
    case "$OPT" in
        l)      [[ s == "$OPTARG" ]] && action=list ;;
        L)      action=list ;;
        [Pp])   port="$OPTARG" ;;
        S)      session="$OPTARG";; ## ; [[ $session =~ ^[0-9]+$ ]] && session="${prefix}-$session" ;;
    esac
done
shift $(($OPTIND - 1))

Host="$1"
shift

if [[ -z "$Host" ]]
then
    echo "ERROR: Missing hostname" >&2
    exit 1
fi


if [[ list == "$action" ]]
then
    ssh ${port:+-p $port} "$Host" "screen -ls"
    exit 0
fi

# Connect repeatedly to the target Host system
#
[[ -z "$session" ]] && session="${prefix}-$$.$Host"

while :
do
    ssh -tt ${port:+-p $port} "$Host" "screen -dr $session || screen -S $session $*"
    ss=$?
    [[ 0 -eq $ss ]] && break

    [[ 255 -eq $ss ]] && sleep 4
    sleep 1
    echo "Reconnecting to session $session on $Host..."
done


# All done
#
exit 0
2
roaima