İnternet bağlantısı koptuğunda tekrar bağlantı kurmaya yarayan betik.

Başlatan munirekinci, 28 Eylül 2008 - 03:51:38

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

munirekinci

abkatbkyzp (ağ bağlantısı koptuğunda ağa tekrar bağlantı kurmaya yarayan zerzevat projesi)

Merhaba arkadaşlar;
Bilgisayar başında olmadığım zaman, ağ (internet) bağlantısını belli aralıklar ile kontrol edecek ve eğer bağlantı kopmuş ise bağlantıyı tazeleyecek bir betik oluşturmak istiyorum.

İzlenecek adımlar şöyle olmalı diye tahmin ediyorum, (tabi sizlerinde önerilerinizi bekliyorum) ve bunların BASH ile nasıl yapılacağı konusunda yardımlarınızı istiyorum;

1- İnternet üzerindeki bir adrese ping atacak

2- Ping belli bir süre içinde cevap verir ise 10dk bekleyip 1. adıma dönecek.

3- Eğer ping belli bir süre içerisinde yanıt vermez ise
falan ve filan komutlarını çalıştırarak ağa bağlantıyı kuracak.

4- Bağlantının kurulup kurulmadığını anlamak için kontrol amaçlı ping atacak.

5- Eğer sonuç gelmezse 3. adıma geri dönecek.

6- Eğer sonuç gelir ise 1. adıma dönecek.

Böyle bir BASH betiği oluşturmam da yardımcı olur musunuz?

Teşekkürler, Saygılar

eldirr

O zaman açılışı ben yapayım, devamını adım adım getirelim.

En sade şekilde aşağıdaki kod 'www.ubuntu-tr.net' adresine ping atarak, cevaba göre konsola 'bağlantı var!' veya 'bağlantı yok!' yazdırıyor. Eğer bağlantı yoksa bir de 'ifconfig' komutunun çıktısını konsola basıyor.

#! /bin/bash
if ping -c 1 www.ubuntu-tr.net
then
   echo "Baglanti var!"
else
   echo "Baglanti yok!"
   echo `ifconfig`
fi


Bir sonraki adım;

*bu kodları 10 dakikalık bir döngü içerisine sokmak olabilir.
*bağlantı yoksa eğer çalıştırılacak komutları 'else' kısmına eklemek olabilir ( o komutları ben bilmiyorum tam şu an ), böylece betik 10 dakikada bir çalışmasa da, bir kere çalıştırıldığında bağlantıyı kontrol edecek ve eğer yoksa tazeleyecek hale gelecektir. Belki bundan sonra da betik içerisinden değil de, betik 'cron job'lar arasına eklenip 10 dakikada bir çalıştırılabilir.





munirekinci

Teşekkürler eldirr. :) Devamını getirmemize yardımcı olacak arkadaşlara da şimdiden teşekkürler.

Ayrıca aklıma takıldı. echo `ifconfig` komutu ifconfig çıktısını sıkıştırıp basıyor ekrana. ifconfig çıktısını içindeki boşluklarda dahil olacak şekilde olduğu gibi göstermek mümkün müdür?

heartsmagic

Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

eldirr


munirekinci

Bu kısmı kişiden kişiye değişebilir, ben netcfg2 ile bağlanıyorum, şu iki komutu art arda vermem  yeterli oluyor;
# netcfg2 -d wlan0
# netcfg2 wlan0

WPA ile bağlananlar için bu kullanılabilir; (DHCP)

# pkill dhcpcd
# wpa_supplicant -c /etc/wpa_supplicant.conf -i wlan0 -D wext -B
# dhcpcd wlan0


WEP ile bağlananlar için de bu kullanılabilir; (DHCP)

#pkill dhcpcd
# ifconfig wlan0 up
# iwconfig wlan0 essid KABLOSUZ-İSMİ key KABLOSUZ-ŞİFRESİ
# dhcpcd wlan0

eldirr

O zaman aşağıdaki kod işini görecektir;


#! /bin/bash

while [ 1 ]
do
if ping -c 1 www.ubuntu-tr.net
then
   echo "Baglanti var!"
else
   echo "Baglanti yok!"
   netcfg2 -d wlan0
   netcfg2 wlan0
fi
sleep 5
done


Şu an 5 saniyede bir kontrol ediyor, o sleep komutunun karşısındaki değer saniye cinsinden yani. Oraya istediğin süreyi saniye cinsinden ayarlayıp yazarsan o kadar sürede bir ubuntu-tr'ye ping atıp, eğer cevap alamazsa alttaki 2 komutu çalıştırıcaktır.

En basit haliyle bu. Tabii kontrol etme süresi gibi değişkenleri komut satırından parametre olarak alıcak şekilde de ayarlayabiliriz. Veya kullanılan ağ ara yüzünün seçimi vb. gibi.

munirekinci

Teşekkürler eldirr çok işime yarayacak.
Senin yaptığından yola çıkarak biraz modifiye ettim.

#! /bin/bash

while [ 1 ]
echo ""
echo "Ag baglantisi test ediliyor..."
do
if
ping -c 3 www.google.com > /dev/null 2>&1
then
   echo "Baglanti var!"
else
   echo "Bağlanti yok!"
   echo "Baglanti kuruluyor..."
   sudo netcfg2 -d wlan0
   sudo netcfg2 wlan0
   echo "Baglanti kuruldu!"
fi
echo "Baglanti testi bitti diger teste kadar bekleniyor..."

sleep 600
done


Bunu açılışa ekledim mi tamamdır.

ebubekirs

Dünyaya gelen de benim, dünyadan giden de benim

munirekinci

Ebubekir haklısın bu benimde aklıma gelmişti. Şöyle birşey yapılabilir mi;

İnternet üzerindeki 3 tane adrese ping atılır en az birisi yanıt veririse ağa karışmaz, ama hiçbiri yanıt vermez ise bağlantıyı yeniden kurar. Bunu BASH'a aktarabilecek biri var mı. :)

eldirr

Sadece 'if' yapısına 'or' ile 2 tane daha adres eklememiz gerekiyor aşağıdaki gibi;

if ping -c 1 www.ubuntu-tr.net || ping -c 1 www.google.com || ping -c 1 www.facebook.com

mesela..

Sırayla bozuk linkler yazarak deneyebilirsin, çalışıyor olması lazım :)

eldirr

Eğer daha da garanti olsun diyorsanız modeminize telnet ile bağlanıp oradan WAN ile ilgili bilgileri alıp, oradan kontrol edilebilir :)

Mesela US Robotics marka modemime telnet üzerinden bağlanıp 'wan show' komutunu verince bağlantı durumu ile ilgili bir tablo veriyor.

Ama gerek kalacağını sanmıyorum, google gibi bir sitenin kapalı olması çok nadir oluyor :)



munirekinci

Çok teşekkürler eldirr en son şekliyle harika oldu abkatbkyzp'ye olan desteğinden ötürü çok teşekkür ederim. Bu projesi sen hayata geçirdin. :) Ama "daha fazlasını iste" görüşü ile gidiyorum. abkatbkyzp'yi daha ileriye taşımalıyız.

Peki şöyle bir şey istesem, modem bazlı bağlantı kopuklukları için, restart. Normalde ben modemime şu 4 adım ile reset atıyorum;

telnet 192.168.2.1
root (yazıyorum enterliyorum)
(şifre olmadığı için hiçbir şey yazmadan enter tuşuna basıyorum)
reboot

Bunu bash a aktarmak mümkün müdür? :)
Çok şey mi istiyorum.

ebubekirs

Ben de tam @eldirr'in yazdığı komutu yazıyordum, baktım o yazmış :) Kendimde denemek için araya www.hyfhrjtudkeokrld.com şeklinde siteler koydum ki bakalım ping atamayınca ne yapacak diye :D
Dünyaya gelen de benim, dünyadan giden de benim

eldirr

(sleep 3; echo "root";  sleep 5; echo "reboot"; sleep 3; echo "exit") | telnet 192.168.1.1

Bunu else kısmına eklemen lazım.

Yalnız modemi yeniden başlattıktan sonra uzun bir bekleme eklemek gerekebilir. Modem tekrar yeniden başlayana kadar ping atamayacağı için resetleyip durabilir çünkü :D

Bir dene istiyorsan, daha sonra gerekli eklemeleri yapalım.

Not: *'exit' komutu da 'logout', 'quit' gibi şeyler olabilir modemine göre.
       *'reboot' dedikten sonra 'exit' demeye de gerek kalmayabilir, çünkü zaten telnet bağlantısını kesiyor olabilir, emin değilim tam olarak o kısmını denemedim çünkü. Ben rasgele bir komut ile denedim o da çalışıyordu. Kısaca telnete böyle bağlanıp modeme komut gönderebiliyorsun. Kendine göre ayarlarsın sen artık.

munirekinci

[munirekinci@ArchLinux ~]$ (sleep 3; echo "root"; sleep 1; echo "";  sleep 5; echo "reboot") | telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.

BusyBox on localhost login: root
Password:


BusyBox v0.61.pre (2007.04.30-15:48+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

# Connection closed by foreign host.
[munirekinci@ArchLinux ~]$


Senin verdiğin doğrudan çalışmadı. (Şifre yi giremedi) Bir iki tane ufak değişiklik yaptım. Ancak bu sefer reboot edemiyor. Çıktısı yukarıda.
Bunun aynısını elle yaptığımda reboot edebiliyor.  :)

eldirr

Ben direk şifre yok sandım, o yüzden atladım o kısmı, boş girmek lazımmış.. Neyse, çıktıya bakılırsa 'reboot' komutunu tanımamış gibi görünüyor. Ama elle yapınca da oluyor diyorsun.. Reboot dışında farklı komutları aynı şekilde çalıştırabiliyor mu onu bir deneyebilir misin? Yoksa yani elle girmekle bir farkı olmaması lazım..

ebubekirs

Alıntı yapılan: munirekinci - 28 Eylül 2008 - 23:46:42
Peki şöyle bir şey istesem, modem bazlı bağlantı kopuklukları için, restart. Normalde ben modemime şu 4 adım ile reset atıyorum;

telnet 192.168.2.1
root (yazıyorum enterliyorum)
(şifre olmadığı için hiçbir şey yazmadan enter tuşuna basıyorum)
reboot

Bunu bash a aktarmak mümkün müdür? :)
Çok şey mi istiyorum.

Yoo, az bile :) Şu kod işini görür büyük ihtimalle

#/bin/bash!
(sleep 3;
echo root;
sleep 3;
echo  ;
sleep 5; echo "reboot";
sleep 8; echo "exit") | telnet 192.168.2.1


bekleme süreleri yeterli olur sanırım, belki fazla bile olabilir, deneyerek anlaşılır.

Düzeltme: Yahu ben ikidir geriden takip ediyormuşum :D
Dünyaya gelen de benim, dünyadan giden de benim

munirekinci

Aslında ikinizin söylediğide doğru yöntemler. Ancak çok ilginç bir şey farkettim.

Aşağıdaki ile modemin içindeki kabuktaki help komutu çalışıyor;
(sleep 3; echo "root"; sleep 1; echo "";  sleep 5; echo ""; echo "help"; sleep 1 ;) | telnet 192.168.2.1

[munirekinci@ArchLinux ~]$ (sleep 3; echo "root"; sleep 1; echo "";  sleep 5; echo ""; echo "help"; sleep 1 ;) | telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.

BusyBox on localhost login: root
Password:


BusyBox v0.61.pre (2007.04.30-15:48+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

#
# help

Built-in commands:
-------------------
        . : bg break builtin cd chdir continue eval exec exit export
        false fc fg hash help jobs kill local pwd read readonly return
        set setvar shift times trap true type ulimit umask unset wait


# Connection closed by foreign host.


Aşağıdaki komut ile çalışmıyor;
(sleep 3; echo "root"; sleep 1; echo "";  sleep 5; echo ""; echo "help"; ) | telnet 192.168.2.1

[munirekinci@ArchLinux ~]$ (sleep 3; echo "root"; sleep 1; echo "";  sleep 5; echo ""; echo "help"; ) | telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.

BusyBox on localhost login: root
Password:


BusyBox v0.61.pre (2007.04.30-15:48+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

# Connection closed by foreign host.


Yani anlayacağınız en son komutta bir aksilik çıkartıyor. Çok ilginç.

Modemi resetleme meselesine gelir isek;

(sleep 3; echo root; sleep 3; echo  ; sleep 5; echo "reboot"; sleep 8; echo ) | telnet 192.168.2.1
Çalışıyor.  :)

(sleep 3; echo root; sleep 3; echo  ; sleep 5; echo "reboot"; ) | telnet 192.168.2.1
Çalışmıyor.

Çıktıları aşağıda;

[munirekinci@ArchLinux ~]$ (sleep 3; echo root; sleep 3; echo  ; sleep 5; echo "reboot"; sleep 8; echo ) | telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.
root

BusyBox on localhost login: Password:


BusyBox v0.61.pre (2007.04.30-15:48+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

# reboot
Connection closed by foreign host.

(Yeniden başlatıyor, ama en sonunda niye hata veriyor bilmiyorum)


[munirekinci@ArchLinux ~]$ (sleep 3; echo root; sleep 3; echo  ; sleep 5; echo "reboot";) | telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.

BusyBox on localhost login: root
Password:


BusyBox v0.61.pre (2007.04.30-15:48+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

# Connection closed by foreign host.

(Hata veriyor ve yeniden başlatamıyor)

Herneyse sonuç olarak yeniden başlatmayı başardık, yardımcı olan herkese teşekkürler.

eldirr

O zaman bir ekleme de benden, hani çok gerekli değil ama antreman olsun diye :)

echo -e `date` >> net.log
echo -e "Baglanti koptu, yeniden baglaniliyor..\n" >> net.log


Kodlarını da hemen 'else' yapısının altına eklersek bir de log dosyamız olmuş olacak. Hangi saat ve tarihte bağlantı yenilenmiş dosyaya yazacak. Ama dosyayı ilk başta kendimiz elle yaratmamız gerekiyor betik ile aynı klasörde. Onu yapamadım şimdi :)

eldirr

@munirekinci, tam olarak ben de ne olduğunu anlamadım ama şimdilik işini görüyorsa kalsın öyle. Boş bir vaktimde ben de kendi modemimde denerim, şu an yeniden başlatamıyorum öyle sürekli ağda başka bilgisayarlar da olduğu için.