29 Mart 2012 Perşembe

linux'da IP adresini okuma

Linux işletim sisteminde komut satırında işletim sisteminin ip adresini öğrenmek için ifconfig komutu kullanılır. Ancak bu komutun çıktısı bir parça uzundur. Eğer özellikle belirli bir arabirimin adresini öğrenmek istiyorsak, ifconfig komutundan sonra arabirim adını da yazarak sadece o ara birimin bilgilerini alabiliriz.

ismail@ismail-laptop:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:26:b9:9a:65:06
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Memory:f6ae0000-f6b00000

eth2 Link encap:Ethernet HWaddr c4:17:fe:1e:fe:6d
inet6 addr: fe80::c617:feff:fe1e:fe6d/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:35
TX packets:0 errors:12 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17 Base address:0xc000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3582 errors:0 dropped:0 overruns:0 frame:0
TX packets:3582 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:456842 (456.8 KB) TX bytes:456842 (456.8 KB)

ppp0 Link encap:Point-to-Point Protocol
inet addr:178.244.166.249 P-t-P:10.64.64.64 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:5463 errors:0 dropped:0 overruns:0 frame:0
TX packets:5612 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:5031133 (5.0 MB) TX bytes:1609578 (1.6 MB)

Ancak benim amacım belirli bir arabirimin sadece ip adresi bilgisini almak ve bunun dışında başka hiç bir bilginin dönmemesini sağlamak. Şu anda 3g modem kullanıyorum ve internete erişmemi sağlayan arabirim ppp0 arabirimi. Örneğin bu arabirimin adresini öğrenmek istiyorsam;

ismail@ismail-laptop:~$ ifconfig ppp0 | grep "inet addr" | awk -F ' ' '{ print $2}'| awk -F ':' '{print $2}'
178.244.166.249

Oh!, çok sert ;)
Birden bire sonuca atlamış olduk. Hadi şimdi adım adım bu komut zincirini açıklayalım:

İşe sadece ppp0 arabiriminin bilgilerini alarak başalayabiliriz,

ismail@ismail-laptop:~$ ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:178.244.166.249 P-t-P:10.64.64.64 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:5717 errors:0 dropped:0 overruns:0 frame:0
TX packets:5871 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:5204480 (5.2 MB) TX bytes:1678921 (1.6 MB)

Bu sayade diğer arabirimlerin bilgilerini elemiş olduk. Bundan sonraki adımda, bu komutun çıktısını bir sonraki komuta girdi yapacağımız için "|" karakterini kullanacağız. İkinci komutumuz olan grep metin içerisinden ifade arayan ve bulduğu satırı döndüren bir komuttur:

ismail@ismail-laptop:~$ ifconfig ppp0 | grep "inet addr"
inet addr:178.244.166.249 P-t-P:10.64.64.64 Mask:255.255.255.255

Yukarıda "inet addr" ifadesinin geçtiği satırı tespit ettik ve sadece o satırı ele almış olduk. Şimdi awk komutu ile bu ifadeyi boşluk karakterlerinden bölüp, hedefimiz olan ip adresinin yer aldığı parçayı seçebiliriz:

ismail@ismail-laptop:~$ ifconfig ppp0 | grep "inet addr" | awk -F ' ' '{print $2}'
addr:178.244.166.249

Hedefe nerdeyse ulaşdık! "addr:" ifadesinden de kurtulduğumuzda sadece ip adresi bilgisine ulaşmış olacağız. Bunun için yine awk kullanarak, ":" karakterinin referansı ile metni parçalayalım ve dizinin ikinci elemanını "print" edelim:

ismail@ismail-laptop:~$ ifconfig ppp0 | grep "inet addr" | awk -F ' ' '{print $2}' | awk -F ':' '{ print $2 }'
178.244.166.249

Son olarak bir detay hakkında uyarıda bulunmak isterim. Eğer bu komut dizisini cron servisi kullanmak niyetinde iseniz kullandığınız komutları "fullpath" yazmalısınız. Zira normalde komut satırında siz bir komut yazıp "enter" tuşuna basdığınızda, oturumunuzun PATH değişkenine bakılır ve bu değişkende tanımlanan klasörlerin içinde böyle bir çalıştırılabilir program olup olmadığı tespit edilir. Bu sebeple sadece komutu yazmak onu çalıştırmak için yeterlidir.

Ancak komut dizinizi cron çalıştırırsa, bir oturum (session) başlatmadığından, onun için bir PATH değişkeni de söz konusu değildir. Dolayısıyla tüm komutları fullpath / tam yoluyla / absolute path olarak ifade etmeliyiz.

Kullandığımız komutların konumlarını öğrenmek için aşağıdaki komutları kullanabiliriz:

ismail@ismail-laptop:~$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
ismail@ismail-laptop:~$ whereis grep
grep: /bin/grep /usr/share/man/man1/grep.1.gz
ismail@ismail-laptop:~$ whereis awk
awk: /usr/bin/awk /usr/lib/awk /usr/share/awk /usr/share/man/man1/awk.1.gz
ismail@ismail-laptop:~$

Sonuç itibariyle elde ettiğimiz komut:

ismail@ismail-laptop:~$ /sbin/ifconfig ppp0 | /bin/grep "inet addr" | /usr/bin/awk -F ' ' '{ print $2}' | /usr/bin/awk -F ':' '{ print $2 }'
178.244.166.249

Bu örnekde hangi arabirimin ip adresini aradığımız biliyorduk: ppp0. Eğer bu bilgiyi de bilmiyor olsaydık nasıl bir yol izlerdik? Bu soruya da diğer makalelerde yer vereceğim..

stdioe Türkçe blog yayına başladı

Uzun süredir bir çok yazarıyla Practical Code Solutions sitesinde yayın hayatına devam eden grubumuz Türkçe makalelerle çok yakında bu sitede karşınızda olacak.