Programowanie > Bash, skrypty powłoki
Szukam pomocy w napisaniu skryptu do przełączania tras
zuskrus01:
Witam
Chciałbym napisać skrypt który będzie pingował jakiś określony host w sieci, i gdy ping-u nie będzie wykona inny skrypt oraz zrobi zapis do zmiennej.
Rozpisałem sobie mniej więcej założenia które chciałbym aby skrypt spełnił i wygląda to tak
--- Kod: ---
1. Monitorowanie adresu IP
2. Przypadku braku odpowiedzi na ping :
2a - Wysyła sms/email
2b - Uruchamia inny skrypt który zmienia trasę
2c - Robi wpis np do jakiegoś pliku lub zmiennej, że nie działa
3. W przypadku braku odpowiedzi na ping, i zmiennej że nie działa nie robi nic
4. W przypadku powrotu pingu, ale zmiennej że nie działa nie robi nic
5. Skrypt opiera się na w/w zmiennej i podejmuje działanie(zmianę trasy poprzez wykonanie innego skryptu) tylko wtedy, gdy zmienna jest np działa
Inny skrypt podczas zmiany trasy z zapasowej na domyślą będzie miał robić zmianę tej zmiennej z nie działa na działa
--- Koniec kodu ---
Od czego powinienem zacząć?
Pozdrawiam
1709:
Napisz jakikolwiek skrypt, bo na razie nie wiadomo w czym masz problem.
Dodatkowo większość odpowiedzi masz w internecie. " linux pytanie "
Kwestia czasu by znaleźć.
Np.
--- Kod: ---
#!/bin/bash
IP="192.168.0.77"
LOSS=$(ping -c 1 "$IP" | grep -oP '\d+(?=% packet loss)')
if [[ "$LOSS" == "0" ]]; then
echo "${LOSS}"
echo "IP odpowiedzial"
elif [[ "$LOSS" == "" ]] ; then
echo "Bledny adres IP"
else
echo "$LOSS"
echo "Nie przyszla odpowiedz od $IP"
logger -p news.alert "Nie przyszla odpowiedz od $IP"
echo "Sprawdzamy syslog:"
grep "Nie przyszla odpowiedz od $IP" /var/log/syslog
echo "Sprawdzamy journalctl:"
journalctl -b0 | grep "Nie przyszla odpowiedz od $IP"
fi
--- Koniec kodu ---
zuskrus01:
Dzięki za odpowiedz
Wiem, dużo rzeczy jest w internecie i pewnie są tez odpowiedzi, tylko nie do końca wiem czego szukać,
np. zapis do zmiennej. Zrobić to na zasadzie zapisu do pliku " działa" albo "nie działa" ?
1709:
" zapis do zmiennej "
--> linux bash zapis do zmiennej
https://duckduckgo.com/?q=linux+bash+zapis+do+zmiennej&t=lm&ia=web
Czyli znajdziesz to w kursach bash
--> linux bash save to variable
https://duckduckgo.com/?q=linux+bash+save+to+variable&t=lm&ia=web
Znajdziesz to także w odpowiedziach np. na stackoverflow.com , unix.stackexchange.com
i na blogach w postaci poradników czy kursów bash
Czy zapisać wynik czyli "output" do zmiennej czy do pliku to zależy tylko od twojej wygody.
Ja bym nie zaśmiecał komputera zbędnymi plikami jeśli to możliwe.
W powyższym przykładzie LOSS to zmienna przechowująca wynik komendy ping.
Powyższa komenda ping
--- Kod: ---
ping -c 1 "$IP" | grep -oP '\d+(?=% packet loss)'
--- Koniec kodu ---
powinna dać wynik 0 lub 100 lub nic. Uwzględnione to jest w warunku " if ".
Podałem także przykład z komendą "logger" jak zapisać komunikat do logu systemowego.
Oraz jak można znaleźć komunikat w logach syslog i journalctl.
Wiecej o komendach przeczytasz wpisując w terminalu
--- Kod: ---
man nazwa_komendy
--- Koniec kodu ---
--- Kod: ---
nazwa_komendy --help
--- Koniec kodu ---
Do pomocy możesz także używać
https://explainshell.com/
shellcheck które można zainstalować i używać do sprawdzania pisowni lub niektórych błędów w skryptach. Należy traktować raczej jako podpowiedz niż wymóg.
Jeszcze coś
Użycie komendy grep do wyciągnięcia określonego fragmentu tekstu czasami jest nazywane parsowaniem.
Polecane jest używanie języka bash https://www.thegeekstuff.com/2010/07/bash-string-manipulation/
Np. użycie pętli while i jeśli wartość się zgadza to wypisanie wartości / tekstu i wyjście z pętli.
Ja osobiście lubię korzystać z komend nie wbudowanych w bash typu: sed , awk .
Komenda compgen może pokazać listę wbudowanych komend https://unix.stackexchange.com/questions/151118/understand-compgen-builtin-command
zuskrus01:
--- Kod: ---
Czy zapisać wynik czyli "output" do zmiennej czy do pliku to zależy tylko od twojej wygody.
Ja bym nie zaśmiecał komputera zbędnymi plikami jeśli to możliwe.
--- Koniec kodu ---
W moim przypadku lepiej chyba do pliku, bo inny skrypt będzie zmieniał tą zmienną jeśli przełączy na trasę domyślną
Zrobiłem coś takiego
--- Kod: ---
#!/bin/bash
IP="10.18.18.1"
LOSS=$(ping -c 1 "$IP" | grep -oP '\d+(?=% packet loss)')
STAN=$(cat stan |grep Dziala)
if [[ "$STAN" == "Dziala" ]]; then
if [[ "$LOSS" == "0" ]]; then
echo "Trasa domyslna odpowiada"
echo "Dziala" > stan
elif [[ "$LOSS" == "" ]] ; then
echo "Bledny adres IP"
else
echo "Host nie odpowiada"
echo "Wysyłam SMS"
#Skrypt do SMS
echo "Wysyłam email"
#Skrypt do email
echo "Uruchamiam skrypt do zmiany trasy"
#Skrypt do zmiany trasy
echo "Zmieniam stan trasy"
echo "Nie dziala" > stan
fi
else
echo "Zmien trase ręcznie"
fi
--- Koniec kodu ---
Jednak niezależnie od tego czy ping jest czy nie ma zwraca mi wynik
--- Kod: ---
Zmien trase ręcznie
--- Koniec kodu ---
Nie bardzo wiem teraz co jest źle :/
Nawigacja
[#] Następna strona
Idź do wersji pełnej