5
Kas
div.example { padding: 5px; font-family: Courier; border: 1px dashed #cccccc; background-color: #eeeeff; margin-left: 5%; margin-right: 5%; }
    Socketler ve portlar ağlarla ilgili çoğu programın temelini oluşturur. Soketler, bir tür süreçler arası haberleşme(interprocessing) yöntemidir. Soket, soyut bir tanımla haberleşme uç noktalarıdır. Pratik olarak soketler dosyalara benzer. Soketten okumak ile dosyadan okumak arasında hiçbir fark yoktur. Socketler için üç alan(domain) tanımlanmıştır:
    Unix Alanı/Dosya-Sistemi Alanı : Bu alandaki socketler bir sistemde iki veya daha süreç birbiriyle haberleşeceği zaman kullanılır. Socketler dosya sistemi içinde yaratılırlar. /var/lock/sock ya da /tmp/sock gibi yerel yolları içerecek şekilde string olarak gösterilirler
    İnternet Alanı : Bu alan TCP/IP üzerinden haberleşen süreçleri göstermektedir. Bu alanda yaratılan socketler (host, port) çiftleri şeklinde gösterilmektedir. Host, string ya da IP adresi şeklinde gösterilebilen host ismidir. Port ise o host üzerinde bağlanılacak portun sayısal değeridir.
    NS Alanı : Bu artık kullanılmayan Xerox protokolü üzerinden haberleşen süreçler için kullanılır.

    Bunlardan sadece ilk ikisi çoğunlukla kullanılmaktadır. Python hepsini destekler. Aşağıda TCP/IP socketleri kullanan bir uygulama yaratmak için gerekli adımlar sıralanmıştır:
    1. Socketi yaratmak (create)
    2. Sockete bağlanmak (connecting)
    3. Socketi bir adrese bağlamak (binding to an address)
    4. Bağlantıları dinlemek ve kabul etmek (listening and accepting connections)
    5. Veri göndermek/veri almak (transffering and recieveing  data)

    Bir socket yaratmadan önce kütüphanelerin yüklenmesi gerekir. socket modülü socketlerle çalışmak için gerekli herşeyi içerir.

    1. Socket Yaratmak
    Python'da socket yaratmak için socket() metodu kullanılır. 
socket(familytype, [protocol])
  • family : family parametresi socketin hangi alan için yaratıldığını belirtir. Birçok seçenek mevcuttur. Genel kullanılanlar ise Unix alanı için AF_UNIX ve internet alanı için AF_INET.
  • type : type kullanılacak protokol tipini belirtir. Tip TCP gibi bağlantı yönelimli (connection-oriented) ya da UDP gibi bağlantısız (connection-less) olabilir. TCP için SOCK_STREAM, UDP için SOCK_DGRAM sabitleri tanımlanmıştır. Diğer geçerli seçenekler ise SOCK_RAW, SOCK_SEQPACKET ve SOCK_RDM.
  • protokol : Bu parametre genellikle varsayılan değer olan 0 olarak bırakılır.
    Bunlar göz önüne alındığında internet alanı bir socket yaratmak için:
s = socket.socket(AF_INET, SOCK_STREAM)

    2. Sockete bağlanmak
    Yaratılan socketler sunucu-taraflı (server-side) ya da istemci-taraflı (client-side) olarak kullanılabilir. Sunucu-taraflı kullanılacaksa bir hosta bağlanması gerekir. Bunu socket nesnesinin connect() metodu ile gerçekleştiririz. connect() metodu host adresini ya da host adresi ve port numarasından oluşan (host, port) şeklinde bir ikiliyi kabul eder. Örneğin adresi 192.168.51.102 ve port numarası 8080 olan bir hosta bağlanmak için:
s.connect(("192.168.51.102", 8080))

    3. Socketi bir adrese bağlamak
    Eğer sunucu-taraflı kullanılacaksa socketin bir adres ve porta bağlanması gerekir. Bunun için bind() metodu kullanılır. bind() metodu parametre olarak socketin bağlanacağı adres ve gelen istekleri dinleyeceği port numarasından oluşan (host, port) şeklinde ikiliyi alır. Örnekse:
s.bind(("192.168.51.107, 8080))

    4. Bağlantı dinlemek ve kabul etmek
    Socket belli bir adrese bağlandıktan sonra, belirtilen porttan gelen istekleri dinlemek için görevlendirilmesi gerekir. Bu amaçla listen() metodu kullanılır. Parametre olarak kaç bağlantının kabul edileceğini alır. En az 1 olamalıdır. Aşağıda 2 bağlantı kabul edilmiştir:
s.listen(2)

    Yapılması gereken sonraki adım bağlantıları kabul etmektir. Bunun için accept() metodu kullanılır. Geriye istemciyi temsil eden bir socket nesnesi ve istemcinin adresini döndürür:
istemsock, adres = s.accept()

    5. Veri göndermek/veri almak
    Veri recv() ve send() metodlarıyla aktarılabilir. recv() metodu sunucu ya da istemciden gönderilen veriyi almak için kullanılır. Parametreler tampon boyu (buffer size) ve bayraklardır (flags). Bayraklar isteğe bağlıdır. Veri almak için kod:
tampon = 1024
s.recv(tampon)

    Veri göndermek içinse send() metodu çağrılır. Parametre olarak gönderilecek veri ve bayrak alır. Örnekse:
veri = raw_input(">>")
s.send(veri)

    Python'un socket dökümantasyonunda bulunan sunucu ve istemci örneğiyse şu şekilde:
    Sunucu:

# Echo server program
import socket
import sys

HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error, msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error, msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()

    İstemci:




# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error, msg:
s = None
continue
try:
s.connect(sa)
except socket.error, msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)


Kaynak ve Bknz:http://www.devshed.com/c/a/Python/Sockets-in-Python-Into-the-World-of-Python-Network-Programming/
http://docs.python.org/library/socket.html
http://cekirdek.uludag.org.tr/~meren/belgeler/socket/socket.htm
8
Ara

Müzik çalışmalarımın yoğunlaşması nedeniyle bu aralar Pardus’umdan uzak kalmış olsam da, Nathan’ın Uluzilla’da girmiş olduğu hatayı[1] hala kapatamadığım için geceleri gözüme uyku girmez oldu!

Bu nasıl bir hatadır ki, geceleri uykumu kaçırıyor? Linux Mint’in (Xfce Community) öntanımlı ağ yöneticisi veya Archlinux’ta netcfg ile uğraşmak istemeyen newbie’lere sıklıkla önerilen bir uygulama olduğu için; daha da önemlisi Pardus’ta Xfce kullananların ağ yöneticisi tercihlerini önemli derecede etkileyebilecek bir hata girdisi olduğu için, daha fazla gecikmeden inşa dosyalarını düzenleyip Review’e gönderdim (haha, gtk2 & glib2 güncellenene kadar sıradan Pardus kullanıcısıyım demiştim; ama Xfce’yi hala takip ettiğimi de ayrıca belirtmiştim =)).

Wicd, ağ servisi olarak çalışıyor:

From linux ekran görüntüleri

Açılışta çalıştırılınca sistem çekmecesine yerleşebiliyor. Xfce’de açılışta çalıştırılan uygulamalar arasında işaretlenmiş bir şekilde görebilirsiniz. Aşağıdaki resimde, sistem çekmecesinin en başındaki simge, Wicd’in simgesi ve yeşil çubuk, kablosuz bağlantı algılama gücünü gösteriyor, yanılmıyorsam:

From linux ekran görüntüleri

Tüm bunların yanında, Wicd’in Türkçe desteğinin olması da bizim için sürpriz niteliğinde. Çevirmene buradan teşekkürler:

From linux ekran görüntüleri

Wicd paketi şuan denetleme & düzenleme aşamasında ve şimdiden bir olumlu yanıt almış durumda. Kısa zamanda Katkı deposunda yerini alacak =) Bol Xfce’li günler..

[1]: http://bugs.pardus.org.tr/show_bug.cgi?id=8358

18
Tem

rinetd, basit bir TCP port yönlendirme aracıdır, sadece port yönlendirme işlemleri yapılabilir. Birden fazla port ile çalışan TCP protokolleri (ör; FTP) rinetd ile çalışmaz.

FreeBSD için kurulum;
#cd /usr/ports/net/rinetd
#make install all

Unix için, bu adresten indirilerek, sisteme kurulabilir.

Çalışma yapısı;

rinetd, rinetd.conf dosyasını okuyarak çalışır. rinetd.conf dosyasının yapısı aşağıdaki gibidir:

bindaddress bindport connectaddress connectport
1.2.3.4 23 4.5.6.7 22

Çalıştırılması;

#rinetd -c /usr/local/etc/rinetd.conf
komutuyla çalışır.

Örnek bir rinetd.conf dosyası;
12.3.4 www 2.3.4.5 8080
allow 1.7.3.*
#1.2.3.4′un www(80). portuna gelen istekleri 2.3.4.5 IP #adresli sunucunun 8080. portuna yonlendir.
#Ek olarak sadece 1.7.3.* Ip adreslerinden gelen #istekler icin bu yonlendirme islemini yap.
10.10.10.1 telnet 10.10.10.2 ssh
#10.10.10.1 Ip adresinin 23. portuna gelen istekleri #10.10.10.2 IP adresinin 22. portun
a yönlendir.

Kayıt tutma;

#logfile /var/log/rinetd.log[1]
#logcommon

[1.] Yapılan baglantıları loglamak için /var/log/rinetd.log dosyasını kullandık.

6
Tem

Kullanılan UNIX/Linux sistemde kullanıcıların girdiği komutları zahmetsiz kayıt altına almak için onları sudo kullanmaya zorlayabilirsiniz. Sudo ile kullanıcının girdiği tüm komutlar bizim belirlediğimiz bir dosyaya kaydedilecektir, bu dosyadan istenilen kullanıcıya ait kayıtlar ayıklanabilir.

Komutların kaydedileceği dosyayı oluşturalım,

#touch /var/log/sudo
sonrasında visudo komutu ile bu dosyayi sudo’ya gösterelim.

#visudo
acilan editorde en alt satira gidip

Defaults logfile=/var/log/sudo

satırını ekleyelim.

Sonuç:

girilen komut

# sudo pisi bi -d pspec.xml

sudo tarafindan sisteme girilen kayıt,

May 14 11:47:29 : root : TTY=ttyp0 ; PWD=/root ; USER=root ;
COMMAND=sudo pisi bi -d pspec.xml

Detaylı bilgi için her zamanki gibi “man 8 sudo” :)