Soluzione 1:
Non ho un host a cui posso inviare tramite ssh e controllare se è attivo o meno, ma dovrebbe funzionare:
while ! ssh <ip>
do
echo "Trying again..."
done
O uno script di shell più esplicito:
#!/bin/sh
ssh $1
while test $? -gt 0
do
sleep 5 # highly recommended - if it's in your local network, it can try an awful lot pretty quick...
echo "Trying again..."
ssh $1
done
Salvalo come (diciamo) waitforssh.sh
e poi chiamalo con sh waitforssh.sh 192.168.2.38
Soluzione 2:
Qualcosa di semplice come questo fa il lavoro, aspettando 5 secondi tra i tentativi e scartando STDERR
until ssh <host> 2> /dev/null
do
sleep 5
done
Soluzione 3:
function hurryup () {
until ssh -o ConnectTimeout=2 "$1"@"$2"
do sleep 1
done
}
hurryup root "10.10.0.3"
-o ConnectTimeout=2
è un modo un po' confuso per evitare di rispondere ai pacchetti di rete, segnalando ssh: connect to host 10.10.0.3 port 22: Operation timed out
finché non risponde.
Quindi, quando l'host risponde ai pacchetti di rete, il secondo di sospensione si verifica tra ssh: connect to host 10.10.0.3 port 22: Connection refused
mentre aspettiamo che arrivi ssh.
Soluzione 4:
Questo è uno script 'ping_ssh' che sto usando. Gestisce i casi di timeout, il successo rapido e non richiede password né viene ingannato dal fatto che la porta sia aperta ma non risponda come con le soluzioni basate su 'nc'. Questo combina diverse risposte trovate su vari siti correlati a StackOverflow.
#!/usr/bin/bash
HOST=$1
PORT=$2
#HOST="localhost"
#PORT=8022
if [ -z "$1" ]
then
echo "Missing argument for host."
exit 1
fi
if [ -z "$2" ]
then
echo "Missing argument for port."
exit 1
fi
echo "polling to see that host is up and ready"
RESULT=1 # 0 upon success
TIMEOUT=30 # number of iterations (5 minutes?)
while :; do
echo "waiting for server ping ..."
# https://serverfault.com/questions/152795/linux-command-to-wait-for-a-ssh-server-to-be-up
# https://unix.stackexchange.com/questions/6809/how-can-i-check-that-a-remote-computer-is-online-for-ssh-script-access
# https://stackoverflow.com/questions/1405324/how-to-create-a-bash-script-to-check-the-ssh-connection
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 ${HOST} -p ${PORT} echo ok 2>&1)
RESULT=$?
if [ $RESULT -eq 0 ]; then
# this is not really expected unless a key lets you log in
echo "connected ok"
break
fi
if [ $RESULT -eq 255 ]; then
# connection refused also gets you here
if [[ $status == *"Permission denied"* ]] ; then
# permission denied indicates the ssh link is okay
echo "server response found"
break
fi
fi
TIMEOUT=$((TIMEOUT-1))
if [ $TIMEOUT -eq 0 ]; then
echo "timed out"
# error for jenkins to see
exit 1
fi
sleep 10
done