Bash - automatyczne

Potrzebujesz pomocy z C, C++, perl, python, itp.
D_Sobieraj
Posty: 11
Rejestracja: 28 listopada 2009, 03:17

Bash - automatyczne łączenie z internetem

Post autor: D_Sobieraj »

Witam.
Mam pewien problem z Bashem, piszę skrypt do autopołączenia z internetem gdy to zostanie zerwane. Napisałem coś takiego:

Kod: Zaznacz cały

#!/bin/bash
ping -c 1 wp.pl | grep "ping: unknown host wp.pl"
read x
z="ping: unknown host wp.pl"
if [ $x = "$z" ]; then
echo "elo"
fi
Jednak coś nie działa, ponieważ skrypt staje na etapie gdy wpiszę:

Kod: Zaznacz cały

sh /etc/skrypt

Pokazuje się albo (gdy odłączę internet):

Kod: Zaznacz cały

unknow host
i zatrzymuje się. A jak jest podłączony to nie robi nic. Otwiera się i stoi. 0 komunikatów.

Może mała wskazówka, jak powinienem dokończyć skrypt?
Z góry dziękuję.
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Szczerze mówiąc, to lepiej użyć intefrejsu D-Bus do Network-Managera:

http://projects.gnome.org/NetworkManage ... orkManager (sygnał StateChanged)

Tu masz tutorial, jak to zrobić: http://dbus.freedesktop.org/doc/dbus-tu ... connection
D_Sobieraj
Posty: 11
Rejestracja: 28 listopada 2009, 03:17

Post autor: D_Sobieraj »

Trochę to trudne, z tego co widzę :-P
Naprawdę nikt nie wie dlaczego ten skrypt w bashu nie działa? Ten język wydaje się prosty.

Skrypt powinien odczytać w przypadku rozłączenia internetu ten grep.

Odczytać grepa, porównać ze zmienną z. I uruchomić skrypt restartu.

Co jest nie tak? Powinno według mnie to działać.
enz
Posty: 12
Rejestracja: 30 lipca 2009, 17:16

Post autor: enz »

Polecenie read służy do pobierania danych od użytkownika. Poczytaj: http://www.linux.rk.edu.pl/w/p/bash-skrypty/

Tak na szybko:

Kod: Zaznacz cały

#!/bin/bash

PING="$( ping -c 1 wp.pl | grep "ping: unknown host wp.pl" )"

if [ "${PING}" = "ping: unknown host wp.pl" ]
then
	echo "elo"
fi
D_Sobieraj
Posty: 11
Rejestracja: 28 listopada 2009, 03:17

Post autor: D_Sobieraj »

Dzięki, a takie coś? Ma prawo działąć ?

Kod: Zaznacz cały

$(ping -c 1 wp.pl | grep "ping: unknown host wp.pl")
x="ping: unknown host wp.pl"

        if [ "$?" != "$x" ];
then
        echo "internet dziala!";
else
        echo "internet niedziala!";
`(iwconfig wlan0 essid alfa_net4p_0-600-356-421 && /etc/init.d/networking restart)`
fi
I jeszcze pytanko, jak zrobić logfile? ¯eby zapisywał wszystko do .log
Intruder
Posty: 8
Rejestracja: 13 września 2008, 14:34

Post autor: Intruder »

Nie znam w zasadzie basha(głównie składni) ale tak proste zadanie zajęło mi 3 minuty.

Kod: Zaznacz cały

time=`date`
echo $time " <-- brak dostępu do internetu" >> net.log
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Dzięki, a takie coś? Ma prawo działąć ?
Nie, nie ma.

Kod: Zaznacz cały

$(ping -c 1 wp.pl | grep "ping: unknown host wp.pl")
To, to co ma robić? Nie pobierasz w żaden sposób wyniku polecenia ping

Kod: Zaznacz cały

if [ "$?" != "$x" ];
Porównujesz tutaj status wyjścia zwracany przez ostatnio wywołane polecenie, w tym wypadku ping (to jest liczba, nie string!) ze stringiem. To nie będzie działało tak jak oczekujesz.

enz i Intruder już właściwie napisali Ci jak to mogłoby wyglądać. Przeczytaj, przemyśl i połącz, a na pewno osiągniesz cel ;-)
D_Sobieraj
Posty: 11
Rejestracja: 28 listopada 2009, 03:17

Post autor: D_Sobieraj »

1. To w jaki sposób mam pobrać wynik polecenia ping ?
Sam skrypt enz nie działa.

Kod: Zaznacz cały

#!/bin/bash

PING="$( ping -c 1 wp.pl | grep "ping: unknown host wp.pl" )"

if [ "${PING}" = "ping: unknown host wp.pl" ];
then
    echo "elo"
else
    echo "elo2"
fi
Jak internet działa, jest ok. Pokazuje mi elo2, ale gdy nie działa.
Mam już komunikat:

Kod: Zaznacz cały

ping: unknown host wp.pl
elo2
Co powinienem zrobić? Jakaś sugestia ? :)
Porównujesz tutaj status wyjścia zwracany przez ostatnio wywołane polecenie, w tym wypadku ping (to jest liczba, nie string!) ze stringiem. To nie będzie działało tak jak oczekujesz.
Czyli to co otrzymuje od pingu to liczba ? Czyli powinienem użyć zamiast = , -eq. ?!
grapeli23
Posty: 30
Rejestracja: 09 października 2009, 12:21

Post autor: grapeli23 »

D_Sobieraj pisze:Co powinienem zrobić? Jakaś sugestia ? :)
Pierwsza rzecz jeśli chcesz się uczyć, to skorzystać z dokumentacji i ją czytać.

Kod: Zaznacz cały

man ping
man bash
man ping pisze:Jeśli ping nie odbierze żadnych pakietów odpowiedzi, to zakończy działanie z kodem wyjścia 1. W przypadku błędu kod ten wynosi 2. W przeciwnym razie zwracane jest 0. Umożliwia to używanie kodu wyjścia do sprawdzania czy hosty żyją, czy gryzą ziemię.

Kod: Zaznacz cały

( ! ping -c1 wp.pl >/dev/null 2>&1 ) && networking restart >/dev/null 2>&1
Najprostsze rozwiązanie, to skorzystać z googla. Gotowych rozwiązań są setki a może i tysiące.
D_Sobieraj
Posty: 11
Rejestracja: 28 listopada 2009, 03:17

Post autor: D_Sobieraj »

Kod: Zaznacz cały


#!/bin/bash

$( ping -c1 wp.pl )

if [ "$?" -eq "2" ];
then
        echo "internet nie dziala!"
        iwconfig wlan0 essid alfa_net4p_0-600-356-421 &
         /etc/init.d/networking restart
                time=`date`
                echo $time " <-- brak dostępu do internetu" >> /mnt/dysk3/internet.log
else
        echo "Internet dziala"
fi
Napisałem coś takiego, działa poprawnie :)
Dzięki.
ODPOWIEDZ