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
Citace od: snuff1987 kdy 31. 08. 2016, 10:53:37
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 par5to 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.