Başarılı oluncaya kadar ssh komutu nasıl çalıştırılır?


28

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?


Etkileşimli bir SSH oturumu ister misiniz?
Kimse

Kimse yok evet
Philip Kirkbride

Tamam, ilk önce fikrimin etkileşimli çalışmayacağını düşündüm, ama kısa bir test yaptığını gösterdi, yine de cevap yazdım. :)
Hiç kimse

Yanıtlar:


30

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
}

1
teşekkürler, ben tekrar komut dosyası kullanacağım ama $istemi yerine :-) ile
Philip Kirkbride

14
Bu fazlalaştı 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.
Austin Hemmelgarn

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

!!Son komutu tekrarlamak için.


4
Kabuk tarihinin yaratıcı kullanımı! +1
David Foerster

15

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 .


Bu benim için çalışıyor gibi görünmüyor: /
Freedo

@ Freedo: Lütfen tam olarak neyi denediğinizi ve tam olarak neyin işe yaramadığını açıklayabilir misiniz? Ayrıca, konunuz hakkında yeni bir soru yazmak daha iyi olacaktır . Dikkatimi yorumların arasında bir link ile çekebilirsiniz.
David Foerster

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

2
Veya, hizmet başlayana kadar oturum açmak istemiyorsanız while ! nc -w5 -z host.example.com 22; do [...],.
DopeGhoti

4

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.


2

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.