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


28

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

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

私の最初の試み:

watch -n5 ssh me@device.local && exit 1

これどうやってするの?


インタラクティブなSSHセッションが必要ですか?
誰も

@Nobodyはい私は
フィリップKirkbride

[OK]を、私は最初に私のアイデアがインタラクティブに機能しないと思ったが、短いテストはそれがそうであることを示したので、とにかく答えを書いた。:)
誰も

回答:


30

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

until ssh me@device.local; do
    sleep 5
done

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

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

1
おかげで、繰り返しスクリプトを使用しますが$、プロンプトの代わりに:
フィリップカークブライド

14
ssh接続の外部でセッションが終了した場合、正常に接続した後にゼロ以外のステータスで終了できることに注意してください。その場合、そのスクリプトは再接続を試みます。これは望ましい副作用である場合とそうでない場合があります。
オースティンヘメルガーン


15

OpenSSHには、ConnectionAttemptsほぼ希望どおりの設定があります。デフォルトは1ですがssh_config、コマンドラインまたはコマンドラインで変更できます。

ssh -o 'ConnectionAttempts 10' ...

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


これは私のために働いていないようです:/
Freedo

@Freedo:あなたが試みたものと正確に機能しなかったものを正確に説明してください。また、問題についての新しい質問書く方が良いでしょう。コメントのリンクを介して、私の注意を引くことを歓迎します。
デビッドフォースター

14
while ! ssh user@host.example.com true; do
    sleep 5
done; echo "Host is back up at $(date)!"

2
または、サービスが起動するまで実際にログインしたくない場合は、while ! nc -w5 -z host.example.com 22; do [...]
-DopeGhoti

4

autosshsshセッションを維持します。適切なパラメータを使用すると、現在接続できない場合に起動することもでき、成功するまで試行します。これは正常に機能しますが、接続部分を対話型セッションでうまく機能させるにはscreen、それと組み合わせるか、同等のものにする必要があります。

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

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

ただし、詳細についてはマニュアルページを参照してください。上記のパラメーターを使用autosshすると、sshの起動が1 AUTOSSH_POLL秒ごとAUTOSSH_GATETIME=0に試行され、最初の試行が失敗した場合に再試行が行われるため(間違いなく必要なもの)、-M 0autosshによる接続チェックが無効になり、以降のオプションはすべてsshに渡されます。2つの-oオプションは、接続が5秒以上切断された場合にsshを終了させます。


2

答えにコードを投げるだけで、このスクリプトは日常的に機能します。私はそれを呼び出し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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.