PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash script um domains zu checken



Thallez
22-04-2004, 15:21
Dieses Script soll Domains checken und bad or nice ausgeben


#!/bin/bash

for name in $(cat ./domains); do
ping -c 1 $name | grep "packets transmitted" | cut -d " " -f 4 ;
if [ $? -eq 0 ];
then
echo "bad"
else
echo "nice"
fi

done

leider gibt es aber das hier aus

0
bad
1
bad

könnte mir vielleicht jemmand helfen danke im vorraus

fork
22-04-2004, 17:17
Ersetze das

ping -c 1 $name | grep "packets transmitted" | cut -d " " -f 4 ;

durch das

ping -c 1 $name >/dev/null 2>&1

Die Variable $? wird von ping zurueckgegeben

Thallez
22-04-2004, 22:01
jetz habe ich aber gar keinen Wert den ich auswerten kann in der Schleife
weil ping alle aus gabe nach /dev/null leitet

fork
22-04-2004, 22:24
$? ist ja keine Ausgabe sondern der Rueckgabewert von ping der nicht ausgegeben sondern nur gesetzt wird.

Thallez
22-04-2004, 22:28
hier kommt entweder eine 1 oder eine 0

ping -c 1 $name | grep "packets transmitted" | cut -d " " -f 4

so bei 0 ist BAD und bei 1 ist nice wie kann ich das sonst lösen

fork
22-04-2004, 22:50
ping -c 1 $name >/dev/null 2>&1
if [ $? -eq 0 ];
then
echo "nice"
else
echo "bad"
fi
oder noch kuerzer:


if ping -c 1 $name >/dev/null 2>&1
then
echo "nice"
else
echo "bad"
fi

Thallez
24-04-2004, 19:48
das geht so nicht wenn ich alles was ping ausgibt nach /dev/null schicke habe ich ja nichts was ich mit cut und grep bearbeiten kann

Thallez
25-04-2004, 01:25
falls ich hier in einer Sackgasse bin nehme ich auch jeden anderen
vorschlag dankend an wie ich domain checken kann

es eght eigentlich nurdarum nach änderungen am Nameserver deren erreichbarkeit zu prüfen

peschmae
25-04-2004, 08:07
Der Code von Fork


if ping -c 1 $name >/dev/null 2>&1
then
echo "nice"
else
echo "bad"
fi

tut doch genau das was du willst, oder?

Ping gibt 0 zurück wenns den Rechner erreicht, sonstwas wenn nicht. Der Rückgabewert wird dann ausgewertet. Probiers doch mal aus.

MfG Peschmä

amiga
25-04-2004, 12:49
alternativ geht natürlich auch das hier :



if ping -q -c 1 meinedomain.de 2>&1 | grep -q ', 0% packet loss'; then
# juhuu ping war erfolgreich
else
# ping war nicht erfolgreich
fi


aber die oben genannte lösung ist irgendwie sinnvoller ;)

fork
25-04-2004, 15:21
Das Problem wenn man auf genaue Ausgabetexte untersucht ist das sich diese natürlich auch mal etwas ändern können(z. B. auch andersprachige Ausgabe). Der exitcode ist deswegen auch robuster.

peschmae
25-04-2004, 18:41
ausserdem ist der Exitcode ja genau für das da :)

MfG Peschmä

P.S. und du kriegst auch true, wenn mal ein Paket verloren ging. Macht hier aber keinen Unterschied weils nur eines ist ;)

Thallez
25-04-2004, 19:00
ich habe die lösung von amiga verwendet es geht jetzt ohne problem

danke für eure hilfe

ThorstenS
26-04-2004, 20:08
Wobei eine whois Abfrage natürlich sinnvoller ist, denn gewisse Domains sind auch manchmal nicht zu erreichen ;)

Sogar google hatte heute bei mir eine downtime von < 1Minute
(von mehreren $Hosts aus angepingt - keine Antwort)

nobody0
26-04-2004, 23:53
Um zu Testen ob mein Router wirklich online ist und nicht wieder die Leute von Teledumm die Leitung nur unidirektional betreiben verwende ich dieses Skript, das minütlich über Crontab aufgerufen wird:



#!/bin/sh
# checkdsl.sh: restart ... if 100% ping loss.
# For use with crontab (like cron.hourly). (nobodyo<nospam>@</nospam>web.de)
# Ping to the access point and DNS servers.
for HOST in 212.114.214.1 212.114.152.1 194.25.2.129 62.96.128.66 195.3.96.67 193.193.144.12 145.253.2.75 195.202.33.68 193.189.224.2 193.189.244.197 194.25.2.130 194.162.162.194 194.183.128.36 62.26.26.62 212.44.160.8 193.141.40.42 134.60.1.111; do
{ ping -Q 0x02 -q -w 3 -c 1 -s 56 $HOST &> /dev/null ; }&& exit
done
# cinternet --verbose --hangup
cinternet --verbose --stop
killall -15 pppd &>/dev/null &
# nohup /bin/terminate smpppd &>/dev/null &
if [ -z "`ps ax | awk '{print $5}' | egrep "(^|/)smpppd"`" ];
then
/usr/sbin/smpppd
sleep 3
# /usr/sbin/rcsmpppd restart
fi
cinternet --verbose --start