Bazen bir cihazı yeniden başlatıyorum ve sshhazır olduğunda geri dönmem gerekiyor .
Komut başarılı olana kadar her 5 saniyede bir ssh komutunu çalıştırmak istiyorum.
İlk denemem:
watch -n5 ssh me@device.local && exit 1
Bunu nasıl yapabilirim?
Bazen bir cihazı yeniden başlatıyorum ve sshhazır olduğunda geri dönmem gerekiyor .
Komut başarılı olana kadar her 5 saniyede bir ssh komutunu çalıştırmak istiyorum.
İlk denemem:
watch -n5 ssh me@device.local && exit 1
Bunu nasıl yapabilirim?
Yanıtlar:
Başka bir seçenek kullanmak olacaktır until.
until ssh me@device.local; do
sleep 5
done
Bunu birkaç ana bilgisayar için tekrar tekrar yaparsanız, bunu bir işlev içine alın ~/.bashrc.
repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
sleep 5
done
}
$istemi yerine :-) ile
sshbağlantısına harici bir şey komut tekrar bağlanma etmeye çalışır durumda oturumu, sona başarıyla eğer bag˘ladıktan sonra sıfırdan farklı durum ile kutu exit. Bu istenen bir yan etki olabilir veya olmayabilir.
ssh me@device.local
until !!; do sleep 5 ; done
!!Son komutu tekrarlamak için.
OpenSSH ConnectionAttemptsneredeyse istediğinizi yapan bir ayara sahiptir. Varsayılan 1'dir, ancak ssh_configkomut satırında veya komut satırında değiştirebilirsiniz:
ssh -o 'ConnectionAttempts 10' ...
Ne yazık ki 1 saniyede sabitlenen deneme aralığını ayarlayamazsınız, ancak bağlantı girişimi zaman aşımını ConnectTimeout(saniye cinsinden) aynı şekilde ayarlayabilirsiniz .
autosshssh oturumlarını canlı tutar. Doğru parametrelerle, şu anda bağlanmak mümkün olmadığında başlatabilirsiniz ve başarılı oluncaya kadar çalışacaktır. Bu iyi çalışıyor, ancak eğer yeniden bağlanın kısmının etkileşimli oturumlarla iyi çalışmasını istiyorsanız, onu bir screenveya eşdeğeri ile birleştirmeniz gerekir .
Bunu tavsiye ederim:
AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host
Ancak ayrıntılar için man sayfasına bakın. Yukarıdaki parametrelerle, autosshher AUTOSSH_POLLsaniye ssh başlatmayı AUTOSSH_GATETIME=0deneyecek, ilk deneme başarısız olursa (bu nedenle kesinlikle ne istersen), tekrar otomatik -M 0hale getirme, otomatik kontrol ile bağlantı denetimini devre dışı bırakacak, sonradan tüm seçenekler ssh'ye geçecek. İki -oseçenek, bağlantılar 5 saniyeden uzun süre düştüğünde ssh çıkışını yapar.
Cevap olarak sadece kod atma riski altında olan bu senaryo günlük olarak benim için çalışıyor. Ben onu ararım resshve basitçe ressh {hostname}veya dikkatle kullanılabilir.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