webentwicklung-frage-antwort-db.com.de

Shell-Skript um zu prüfen, ob ein Server erreichbar ist?

Ich habe 5 Solaris-Server an verschiedenen Standorten. Manchmal sind einige dieser Server aus verschiedenen Gründen nicht von meinem Standort aus erreichbar (entweder aufgrund von Netzwerkproblemen oder weil der Server plötzlich ausfällt).

Deshalb würde ich gerne ein Bash-Shell-Skript schreiben, um zu prüfen, ob sie erreichbar sind. Was ich ausprobiert habe ist:

ssh ipaddress "uname -a"

Passwortlose Authentifizierung ist eingestellt. Wenn ich keine Ausgabe erhalte, erstelle ich eine Mail.

  1. Gibt es noch andere Möglichkeiten, um die Erreichbarkeit des Servers zu überprüfen?
  2. Welcher ist der beste Weg?
  3. Ist das, was ich versucht habe, korrekt?
13

Sie können ping -c4 $ip_address verwenden, wobei $ip_address die IP Ihres Remote-Servers ist, und die Ausgabe analysieren, um die erfolgreichen Pakete und/oder die fehlgeschlagenen Pakete zu erfassen, und das Protokoll mit mail -s per E-Mail senden. 

Hier ist etwas für den Einstieg und Sie können darauf aufbauen. 

ping -c4 www.google.com | awk '/---/,0'

Dies ergibt eine Ausgabe wie diese -

[jaypal:~/Temp] ping -c4 www.google.com | awk '/---/,0'
--- www.l.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 36.638/36.870/37.159/0.196 ms

Ich habe den Solaris man-page auf ping geprüft. Die Ausgabe von ping auf der Solaris-Box unterscheidet sich. Unter Linux beschränken Sie die Pakete auch, indem Sie -c und die Anzahl der Pakete angeben. Unter Solaris müssten Sie -

ping -s www.google.com 2 4

/usr/sbin/ping -s [-l | -U] [-adlLnrRv] [-A addr_family]
[-c traffic_class] [-g gateway [ -g gateway...]] [-
F flow_label] [-I interval] [-i interface] [-P tos] [-
p port] [-t ttl] Host [data_size] [npackets]
                           ^           ^
                           |           |
---------------------------------------  

Leider habe ich keine Solaris-Box, mit der ich Ihnen helfen kann. 

4
jaypal singh

Ihr ssh-Befehl testet mehr, als ob der Server erreichbar ist. Damit er funktioniert, muss der ssh-Server ausgeführt werden, und bei der Authentifizierung muss alles stimmen.

Um zu sehen, ob die Server aktiv sind, wie wäre es mit einem einfachen Ping?

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
22
gcbenison

Die meisten Barebones-Prüfungen, die Sie durchführen können, sind wahrscheinlich netcat, um nach offenen Ports zu suchen.

um die Erreichbarkeit von SSH (Port 22) zu prüfen, können Sie dies tun

if nc -z $server 22 2>/dev/null; then
    echo "$server ✓"
else
    echo "$server ✗"
fi

von der manpage:

-z Gibt an, dass nc nur auf hörende Daemons scannen soll, ohne Daten an sie zu senden.

20
flying sheep

Sie können diese Optionen auf der Ping-Man-Seite verwenden: 

  • nur ein Paket senden ("c1"), 
  • ruhemodus ("q"), 
  • (optional) Warten Sie 1 Sekunde auf eine Antwort ("W1")

    ping -c1 -W1 -q $server

Ping gibt je nach Art des Fehlers unterschiedliche Beendigungscodes zurück. Um zu testen, ob es funktioniert hat oder nicht, tun Sie einfach "echo $?" um den Exit-Code zu erhalten. So was: 

ping 256.256.256.256 ; echo $?
# 68

ping -c 1 127.0.0.1 ; echo $?
# 0

ping -c 1 192.168.1.5 ; echo $?
# 2

Woher

0 means Host reachable
>0 means unreachable

Um dies in einem Bash-Skript zu testen, können Sie Folgendes tun:

ping -c1 -W1 -q $server &>/dev/null
status=$( echo $? )
if [[ $status == 0 ]] ; then
     #Connection success!
else
     #Connection failure
fi
5
Katie S

Weitere Denkanstöße: Verwenden Sie nmap oder nc, pingen Sie niemals.

Ping: Warum sollten Sie Ping nicht verwenden? (1) Es ist besser, das System und den Port gleichzeitig zu überprüfen. (2) Ping ist unzuverlässig, da das ICMP-Echo in vielen Situationen blockiert ist.

Nmap: Dies ist sehr schnell, sehr zuverlässig, erfordert jedoch die Installation von nmap Bevorzugte Methode NMAP (ex Host IP 127.0.0.1):

nmap 127.0.0.1 -PN -p ssh | grep open

Nc: nc ist normalerweise bereits installiert. Auf einigen Systemen wie Mac OS X bleibt der Befehl jedoch auf nicht erreichbaren Systemen hängen. (siehe Problemumgehung)

nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"

Mac OSX Workaround:

bash -c '(sleep 3; kill $$) & exec nc -z 127.0.0.1 22' &> /dev/null
echo $?
0
bash -c '(sleep 3; kill $$) & exec nc -z 1.2.3.4 22' &> /dev/null
echo $?
143

(Beispiele veranschaulichen die Verbindung zu Port 22 ssh über ein gutes und ein schlechtes Host-Beispiel. Verwenden Sie $?, um festzustellen, ob der Host mit einer Ruhezeit von 3 Sekunden erreicht wurde.)

Für Mac-Benutzer (hauptsächlich) usw. können Sie den Befehl im Skript folgendermaßen verwenden:

    # -- use NMAP, if not avail. go with nc --
    if command -v nmap | grep -iq nmap ; then
        nmap ${ip} -PN -p ${ssh_port} | grep -iq "open"
        res=$?
    Elif command -v nc | grep -iq nc ; then
        # -- run command if fails to complete in 3 secs assume Host unreachable --
        ( nc -z ${ip} ${ssh_port} ) & pid=$!
        ( sleep 3 && kill -HUP $pid ) 2>/dev/null & watcher=$!
        if wait $pid 2>/dev/null; then
            pkill -HUP -P $watcher
            wait $watcher
            # -- command finished (we have connection) --
            res=0
        else
            # -- command failed (no connection) --
            res=1
        fi
    else
        echo "Error: You must have NC or NMAP installed"
    fi

    if [[ ${res} -lt 1 ]] ;then
        success=1
        echo "testing  => $ip SUCCESS connection over port ${ssh_port}"
        break;
    else
        echo "testing => $ip FAILED connection over port ${ssh_port}"
    fi
1
Mike Q

Sie können den folgenden Befehl verwenden: 

ping -c1 -W1 ip_addr || echo 'server is down'  

sie können $ ip_addr nicht verwenden, da dadurch die erste Nummer Ihrer IP-Adresse entfernt wird.

0
rocket singh

Sie können den nc -z -G 2 SERVER_Host PORT-Ansatz mit G verwenden, anstatt W -> G für das Zeitlimit vor dem Verbindungsaufbau zu verwenden, sodass der Host nicht erreichbar ist und Sie schneller wissen

0
Ivo Varbanov