A volte riavvio un dispositivo e devo riaccedere ssh
quando è pronto.
Voglio eseguire il comando ssh ogni 5 secondi fino a quando il comando non riesce.
Il mio primo tentativo:
watch -n5 ssh me@device.local && exit 1
Come posso fare questo?
A volte riavvio un dispositivo e devo riaccedere ssh
quando è pronto.
Voglio eseguire il comando ssh ogni 5 secondi fino a quando il comando non riesce.
Il mio primo tentativo:
watch -n5 ssh me@device.local && exit 1
Come posso fare questo?
Risposte:
Un'altra opzione sarebbe quella di utilizzare until
.
until ssh me@device.local; do
sleep 5
done
Se lo fai ripetutamente per un numero di host, mettilo in una funzione nel tuo ~/.bashrc
.
repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
sleep 5
done
}
$
invece del prompt :-)
ssh
può uscire con uno stato diverso da zero dopo essersi connessi correttamente se qualcosa di esterno alla connessione termina la sessione, nel qual caso lo script tenterà di riconnettersi. Questo può o meno essere un effetto collaterale desiderabile.
ssh me@device.local
until !!; do sleep 5 ; done
Il !!
per ripetere l'ultimo comando.
OpenSSH ha ConnectionAttempts
un'impostazione che fa quasi quello che vuoi. Il valore predefinito è 1 ma è possibile modificarlo nella ssh_config
o nella riga di comando:
ssh -o 'ConnectionAttempts 10' ...
Purtroppo non è possibile regolare l'intervallo di tentativo fissato a 1 secondo, ma è possibile regolare il timeout del tentativo di connessione ConnectTimeout
(in secondi) nello stesso modo.
while ! ssh user@host.example.com true; do
sleep 5
done; echo "Host is back up at $(date)!"
while ! nc -w5 -z host.example.com 22; do [...]
.
autossh
mantiene vive le sessioni ssh. Con i parametri giusti puoi anche avviarlo quando è attualmente impossibile connettersi e proverà fino a quando non avrà successo. Questo funziona bene, ma se si desidera che il re parte di connessione al lavoro bene con sessioni interattive di cui ha bisogno per combinarlo con screen
o equivalente.
Consiglio questo:
AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host
Ma vedi la sua pagina man per i dettagli. Con i parametri sopra, autossh
proverò ad avviare ssh ogni AUTOSSH_POLL
secondo, lo AUTOSSH_GATETIME=0
farà riprovare se il primo tentativo fallisce (quindi sicuramente quello che vuoi), -M 0
disabilita il controllo della connessione tramite autossh, tutte le opzioni successive vengono passate a ssh. Le due -o
opzioni fanno uscire ssh se le connessioni scendono per più di 5 secondi.
A rischio di lanciare semplicemente un codice per una risposta, questo script funziona per me quotidianamente. Io lo chiamo ressh
e può essere usato semplicemente ressh {hostname}
o con cura,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