GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-Befehl zum Warten auf das Hochfahren eines SSH-Servers

Lösung 1:

Ich habe keinen Host, zu dem ich ssh und kontrollieren kann, ob er aktiv ist oder nicht, aber das hier sollte funktionieren:

while ! ssh <ip>
do
    echo "Trying again..."
done

Oder ein expliziteres Shell-Skript:

#!/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

Speichern Sie es beispielsweise unter waitforssh.sh und dann mit sh waitforssh.sh 192.168.2.38 aufrufen

Lösung 2:

Etwas Einfaches wie dieses erledigt den Job, es wartet 5 Sekunden zwischen den Versuchen und verwirft STDERR

until ssh <host> 2> /dev/null
  do
    sleep 5
  done

Lösung 3:

function hurryup () { 
    until ssh -o ConnectTimeout=2 "$1"@"$2"
        do sleep 1
    done
}
hurryup root "10.10.0.3"

-o ConnectTimeout=2 ist eine etwas hackige Methode, um nicht auf Netzwerkpakete zu reagieren und ssh: connect to host 10.10.0.3 port 22: Operation timed out zu melden bis es reagiert.

Dann, wenn der Host auf Netzwerkpakete antwortet, passiert der 1-Sekunden-Schlaf zwischen ssh: connect to host 10.10.0.3 port 22: Connection refused während wir darauf warten, dass ssh hochkommt.

Lösung 4:

Dies ist ein 'ping_ssh'-Skript, das ich verwende. Es handhabt Timeout-Fälle, schnellen Erfolg und fordert nicht zur Eingabe von Passwörtern auf oder lässt sich nicht täuschen, wenn der Port offen ist, aber nicht antwortet, wie es bei 'nc'-basierten Lösungen der Fall ist. Dies kombiniert mehrere Antworten, die auf verschiedenen Stackoverflow-bezogenen Websites gefunden wurden.

#!/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

Linux
  1. 8 Tipps für die Linux-Kommandozeile

  2. 12 IP-Befehlsbeispiele für Linux-Benutzer

  3. W-Befehl unter Linux

  4. Bei Befehl unter Linux

  5. Linux-Killall-Befehl für Anfänger (8 Beispiele)

Linux-Suchbefehl für Anfänger (8 Beispiele)

16 praktische Beispiele für Linux LS-Befehle für Anfänger

Linux-mv-Befehl für Anfänger erklärt (8 Beispiele)

ls-Befehl in Linux zum Auflisten von Dateien

Wartebefehl in Linux mit Beispielen

So führen Sie SSH zum Server über Linux