:::: MENU ::::

lsof (List Open Files) Komutu Kullanımı

lsof, süreçler(process) tarafından açılmış olan dosyaları listelemeye yarayan bir araçtır. *nix sistemlerde, nerdeyse herşey bir dosya olarak varlık gösterir. Sürecin eriştiği ya da açtığı  bir dosya olabileceği gibi, bir dizin, bir block aygıt dosyası (block device),  bir sistem kütüphanesi ve ya bir network dosyası (network socket, Unix domain socket) olabilir. Dolayısı ile lsof ile süreçlerin eriştikleri dosyaları saptamak ve  ilgili süreçlerin arka planda yaptığı işlemlerle ilgili daha net fikirler elde edebiliriz. Bundan dolayı  sorun giderme noktasında  lsof çok güçlü bir araçtır.

Kurulum 

Aslında lsof bir çok popüler sistemde öntanımlı olarak kurulu geliyor. Ancak bazı istisnai durumlar olabiliyor.

RHEL, CentOS, Fedora 

RHEL ve CentOS’larda lsof öntanımlı olarak gelmektedir. Ancak sistemimizde durum bu şekilde değilse yum ile kolayca kurabilirsiniz:

Debian, Ubuntu 
Aynı durum, Debian ve Ubuntu’lar için de geçerlidir. Ancak sistemimizde kurulu olmaması durumunda apt-get ile kolayca kurulabilir:

 Kullanım 

lsof’u herhangi bir parametre kullanmadan direk çalıştırırsanız sistemde açık olan tüm dosyaların uzunca bir listesini dökecektir.

lsof’un bir çok kullanışlı parametresi bulunmaktadır. Bunlara hızlıca bir göz atmak için -h (help) parametresi ile yardım çıktısını inceleyebileceğiniz gibi aşağıda sıkça lazım olabilecek örnek komutlardan da yardım alabilirsiniz.

Örnekler 

Tüm port ve bağlantıların listelenmesi 

Açık olan tüm network socketleri ve aktif bağlantıları listelemek için -i parametresi kullanılmaktadır.

Örnek bir çıktı şu şekildedir:

Output

Görüldüğü gibi dinlenen (LISTEN) tüm portlar ve aktif bağlantılar listelenmektedir.

Eğer, port ve hostname’lerin isim çözümlemesi yapılmadan numerik olarak listelenmesini isterseniz -Pni parametrelerini kullanmanız gerekir:

Sadece TCP port ve bağlantıları listelemek isterseniz de -iTCP parametresini kullanmanız gerekir.

Aynı şekilde -iUDP derseniz UDP bağlantılar listelenir.

Belli port ve bağlantıların listelenmesi 

Tüm port ve bağlantıların listelenmesinden ziyade, belirli bir port üzerideki aktiviteyi görmek için lsof “-i :portnumarası” şeklinde kullanılabilir.
Örnek olarak ssh’a (tcp 22) ait durumu listelemek için aşağıdaki komut kullanılmalıdır.

Komutun çıktısı aşağıdakine benzer olacaktır.

Output

Görüldüğü gibi ssh daemon’ının 22. portu dinlediği ve ssh servisine hangi kullanıcıların, hangi süreç numarası ile bağlalı bulunduğu gibi bilgiler listelenmektedir.

Belirli bir port aralığını listelemek istemeniz durumunda da lsof’u şu şekilde kullanabilirsiniz:

Böylece listeleme işlemi 20 ile 200. port aralığını kapsanacaktır.

Belirli bir IP’den kurulan bağlantılar 

Spesifik bir ip adresinden açılan bağlantıları listelemek için ise aşağıdaki komut kullanılabilir.

Örnek bir çıktı aşağıdakine benzer olacaktır.

Output

Kullanıcıların açtığı dosyalar 

Örnek olarak, sistemde omer kullanıcısı tarafından açılan dosyaların bir listesi şu şekilde alınabilir:

Hem cagri hem de root kullanıcısı tarafından açılan dosyaların listelenmesi için komut şu şekildedir.

root kullanıcısı dışında kalan diğer tüm kullanıcılar tarafından açılmış dosyaların tespiti ise aşağıdaki gibi yapılabilir.

Belli bir dosyaya erişen süreçler 

Örnek olarak /var/log/messages isimli dosyaya kimlerin eriştiğini görmek için lsof şu şekilde kullanılabilir:

Belli bir dizine erişen kullanıcı ve süreçler 

Mesela, /var/log/ dizini altındaki dosyalara erişen tüm süreçleri listelemek için +d paramertesi kullanılabilir:

/var/log/ dizininde ve tüm alt dizinlerinde bulunan dosyalara erişen süreç ve kullanıcıların listesi için ise +D parametresi kullanılabilir:

Belirli bir disk bölümüne erişen süreçler 

Unmount etmek istediğiniz bir disk bölümünüz var, fakat bir süreç bu disk alanındaki bir dosyayı açmış olduğundan dolayı, unmount işlemi disk alanı meşgul olduğu için başarısız oluyor. Bu durumda misal olarak /dev/sda1 isimli disk bölümündeki dosyaya erişen ilgili süreci/kullanıcıyı tespit etmek için lsof’u aşağıdaki şekilde kullanabilirsiniz.

Spesifik bir sürecin açtığı dosyalar 

Diyelim ki apache sunucusuna ait 18828 numaralı sürecin eriştiği tüm dosyaları listelemek istiyorsunuz. Bu durumda aşağıdaki şekilde bir komut kullanabilirsiniz.

Belirli bir komut çalıştıran süreçler 

Mesela, bash kabuğunu çalıştıran tüm süreçlerin bir listesi şu şekilde alınabilmektedir:

Birden fazla kritere göre listeleme 

lsof ile birden fazla kritere göre listeleme yapmak için -a parametresi kullanılabilmektedir. “and” / “or” anlamina gelen -a parametresi iki lsof sorgusunun birleştirilmesine olanak sağlamaktadır.

Örnek olarak, 192.168.12.22 ip adresinden gelen ve/ve ya sunucunun 80. portu ile ilgili bağlantıların listesi şu şekilde alınabilir:

-a ve / ve ya anlamini içerdiği için 80. portu dinleyen apache süreçleride çıktı da yer alacaktır. Sadece establish olmuş bağlantıları listelemek için, komut çıktısını grep’leyebilirsiniz.

-a parametresi için örnekleri çoğaltmak mümkün. Misal olarak cagri kullanıcısının /usr/lib/ dizinindeki hangi kütüphanelere eriştiğini görüntülemek için komut şu şekilde kullanılabilir:

Sadece süreç numaralarının listelenmesi 

lsof’un -t parametresi, yapılan sorgularda sonuç olarak sadece ilgili süreç numaralarının döndürülmesini sağlamaktadır. Özellikle bir shell script vasıtasi ile spesifik bir sürecin sonlandırılması gibi işlemler için oldukça idealdir.

Bu şekilde herhangi bir dosya ya da dizine erişen süreçler ya da belirli bir porta erişen bağlantılar sonlandırılabilir.

Örnek olarak, 192.168.12.22 ip’sinden kurulmuş çağrı kullanıcısına ait ssh oturumunu sonlandırmak için şu şekilde bir komut kullanılabilir:

Daha fazla bilgi için aşağıdaki adreslere göz atabilirsiniz.
http://www.manpagez.com/man/8/lsof/ 
http://en.wikipedia.org/wiki/Lsof 


So, what do you think ?

You must be logged in to post a comment.