Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Kyblík 31. 08. 2016, 00:22:07
-
Zdravím,
chtěl bych poprosit, jestli by mi někdo nepomohl upravit můj script pro testování pingu v shellu Debianu.
Potřebuju zachytit do souboru ping větší než X, třeba 30ms. Tu řádku jsem nějak dal dohromady, ale testování velikosti a následně zápis do souboru je už asi nad moje programovací schopnosti, pač je to už dávno, co jsem něco naprogramoval.
ping -c 500 -s 1024 www.six.sk > /var/log/ping/www.six.sk-ping &
Uvedený řádek udělá 500 pingů a vše zapíše do souboru.
Já ale potřebuju pustit ping třeba na 10 hodin a zapsat jen hodnoty vetší než X.
Pokud by někdo byl ochoten ušetřit mě hodiny studování programování v shellu, byl bych mu moc vděčen.
-
Zdravím, skúsil som niečo narýchlo napísať. Niesom síce expert na bash, ale fungovať by to malo.
#!/bin/bash
hours=10 # 10 hodin
max_value=30 # 30 ms
end=$((`date +%s` + 3600 * $hours))
while [[ "`date +%s`" -lt "$end" ]]; do
line=`ping -c 1 -s 1024 www.six.sk | sed -n '2p'`
value=`echo "$line" | awk {'print $8'} | cut -d= -f2`
if [[ "`echo "$value > $max_value" | bc -l`" -eq 1 ]]; then
echo $line >> /var/log/ping/www.six.sk-ping
fi
sleep 1
done
-
pokud jde jen o nezobrazeni radek pingu s time <=30ms, tak treba jen pridat grep, parametr -v zapina inverzi, prvni time je pro rozsah 0-9ms, druhej time pro 10-30ms, tecka znamena jakejkoliv znak, \tecka znamena regulerni tecku..
ping -c 500 -s 1024 www.six.sk | grep -v -e 'time=[0-9]\.' -e 'time=[1-3].\.' > /var/log/ping/www.six.sk-ping &
-
Tisíceré díky pánové, něco jako napsal stpd jsem zkoušel polepit, ale s těmi chabými zvyšky basicu bych to určo nedal.
Myslel jsem, že to v shellu bude něco jako napsal nobody(ten pravej) a ejhle, hned tady mám oba způsoby, to jsem ani ve su nedoufal, jdu to hned hodit na ten moji samba krabičku a postuduju.
Ještě jednou díky.
-
Jen malý detail...
-e 'time=[1-3].\.'
odpovídá rozsahu od 10.0 až po 39.9 takže 1-2 bude asi lepší s tím, že rovných 30 už bude moc, nebo přidat podmínku ještě na rovných 30.0
-
Od toho tu mame tcpdump (pro sber dat do pcap souboru) a wireshark (pro pozdejsi analyzu).
-
Prozatím jsem zkoušel script od stpd, no a je tam nějakej zádrhel. Po spuštění bash vypíše tohle:
root@debian:/usr/local/bin# ./ping_test_If_then
./ping_test_If_then: 19: ./ping_test_If_then: [[: not found
V editoru jsou v řádcích:
line=`ping -c 1 -s 1024 www.six.sk | sed -n '2p'`
value=`echo "$line" | awk {'print $8'} | cut -d= -f2`
červeně vysvíceny apostrofy a text mezi nima má černé pozadí proti modrému u ostatního textu.
Tak teď studuju, co dělají apostrofy, neboř to vypadá, že je chyba v nich.
-
Dovolil bych si nabidnout jeste jeden narychlo sesmoleny skript highping.sh:
#!/bin/bash
if [ $# -lt 2 ]; then
echo "Spatna syntaxe - highping.sh <hostname> <maxtime> [dalsi parametry pro ping]"
exit 1
fi
checknum="^[0-9]+(.[0-9]+)?$"
if ! [[ $2 =~ $checknum ]] ; then
echo "Spatna syntaxe - highping.sh <hostname> <maxtime> [dalsi parametry pro ping]"
echo "<maxtime> musi byt cislo";
exit 1
fi
ping $1 "${@:3}" | awk -v time=$2 -F 'time=| ms' '{if (length($2) == 0) print $0; else if ($2>time) print $0}'
Jako prvni parametr to chce jmeno serveru, druhy je cas v ms - pokud je ping vetsi nez cas, vypise ho to a volitelne dalsi parametry jsou predany pingu, takze napriklad
./highping.sh www.six.sk 15 -i 0.1
pinga na www.six.sk s intervalem 0.1sec a vypisuje ping vetsi, nez 15ms
jeste doplnim, cislo muze byt i desetinne
-
A jeste bych ten radek s pingem upravil
ping $1 "${@:3}" | awk -v stamp=$(date +%s) -v time=$2 -F 'time=| ms' '{if (length($2) == 0) print strftime("%s")" "$0; else
if ($2>time) print strftime("%s")" "$0}'
cimz se na zacatek kazdeho radku pripise timestamp, aby log k necemu byl.
-
Dufam, ze to nejde cez wifi. To by chcelo potom pingat nieco ine ako six.sk
-
Tuxik: co konkretne robi toto "${@:3}" v tom poslednom riadku? Dakujem
-
Tuxik: co konkretne robi toto "${@:3}" v tom poslednom riadku? Dakujem
předá všechny parametry skriptu od třetího dál. Například při zavolání skriptu s parametry
./skript.sh par1 par2 par3 par4 par5
to vrátí hodnotu "par3 par4 par5".
Použil jsem to tam pro předání dalších parametrů přímo příkazu ping, kdyby byly potřeba.
-
Kyblík, ten problém zrejme nieje v apostrofoch, ale v zátvorkách. Skús vymeniť [[ ... ]] za klasické [ ... ] (v tom if-e a while), potom by to už malo fungovať.
-
Jelikoz neco podobneho budu brzy potrebovat, tak jsem to napsal uz ted. Verim, ze tento mustr bude stacit na to dodelat si logiku podle sveho.
Testovano Debian a Slackware, ping ma docela stabilni format.
pingMonitoring.sh
#!/bin/bash
HOST="seznam.cz"
COUNT=100
LEVEL=4
echo "Monitoring ping for $HOST($COUNT times)"
IFS=" " ping -c $COUNT $HOST | grep --line-buffered 'time=' | \
while read -r aLEN aD aD aHOST aIP aSEQ aTTL aTIME aTIMEUNIT
do
IFS="= " read -r aD TIME <<< $aTIME
TIME=${TIME%.*} #useknout desetiny, pokud jsou potreba, tak dale bc
if [ "$TIME" -ge $LEVEL ]; then
echo "$HOST: $TIME $aTIMEUNIT - Pisu si te..."
else
echo "$HOST: $TIME $aTIMEUNIT- Zde je svet jeste v poradku"
fi
done
-
co tak pouzit https://www.nagios.org/downloads/nagios-plugins/ konkretne check_ping. nemusis kvoli tomu instalovat cely nagios staci pouzit ten jeden konkretny plugin. cez parametre nastavis hranicu co neni oka a v pripade exit codu != 0 to budes pisat dalej.
-
Dík všem, script od stpd po opravě funguje, prozatím jej použiju, ale všechno použiju jako studijní materiál, snad nezapomenu napsat výsledek celé záležitosti.