デバイスを再起動して、準備ができたらssh
に戻る必要がある場合があります。
コマンドが成功するまで5秒ごとにsshコマンドを実行したいと思います。
私の最初の試み:
watch -n5 ssh [email protected] && exit 1
これどうやってするの?
別のオプションは、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
}
ssh [email protected]
until !!; do sleep 5 ; done
!!
は、最後のコマンドを繰り返します。
OpenSSHには、ほぼ必要なことを行うConnectionAttempts
設定があります。デフォルトは1ですが、ssh_config
またはコマンドラインで変更できます。
ssh -o 'ConnectionAttempts 10' ...
残念ながら、1秒に固定されている試行間隔は調整できませんが、同じ方法で接続試行タイムアウトConnectTimeout
(秒単位)を調整できます。
while ! ssh [email protected] true; do
sleep 5
done; echo "Host is back up at $(date)!"
autossh
は、sshセッションを存続させます。適切なパラメータを使用すると、現在接続することが不可能で、成功するまで試行することもできます。これは正常に機能しますが、re connectパーツをインタラクティブセッションでうまく機能させるには、screen
または同等のものと組み合わせる必要があります。
私はこれをお勧めします:
AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@Host
ただし、詳細についてはそのmanページを参照してください。上記のパラメータを使用すると、autossh
はAUTOSSH_POLL
秒ごとにsshを起動しようとします。AUTOSSH_GATETIME=0
は、最初の試行が失敗した場合に再試行します(間違いなく希望どおり)、-M 0
autosshによる接続チェックを無効にします。それ以降のオプションはすべてsshに渡されます。 2つの-o
オプションは、接続が5秒を超えてドロップした場合にsshを終了させます。
答えにコードを投げるだけのリスクがあるので、このスクリプトは私にとって日常的に機能します。私はそれを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