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:
1 |
# yum install lsof |
Debian, Ubuntu
Aynı durum, Debian ve Ubuntu’lar için de geçerlidir. Ancak sistemimizde kurulu olmaması durumunda apt-get ile kolayca kurulabilir:
1 |
$ sudo apt-get install lsof |
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.
1 |
# lsof -i |
Örnek bir çıktı şu şekildedir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1551 rpc 6u IPv4 10353 0t0 UDP *:sunrpc rpcbind 1551 rpc 7u IPv4 10355 0t0 UDP *:878 rpcbind 1551 rpc 8u IPv4 10356 0t0 TCP *:sunrpc (LISTEN) rpcbind 1551 rpc 9u IPv6 10358 0t0 UDP *:sunrpc rpcbind 1551 rpc 10u IPv6 10360 0t0 UDP *:878 rpcbind 1551 rpc 11u IPv6 10361 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1569 rpcuser 5u IPv4 10439 0t0 UDP *:897 rpc.statd 1569 rpcuser 8u IPv4 10450 0t0 UDP *:38442 rpc.statd 1569 rpcuser 9u IPv4 10454 0t0 TCP *:60010 (LISTEN) rpc.statd 1569 rpcuser 10u IPv6 10458 0t0 UDP *:47439 rpc.statd 1569 rpcuser 11u IPv6 10462 0t0 TCP *:50237 (LISTEN) snmpd 1802 root 7u IPv4 11292 0t0 UDP *:snmp snmpd 1802 root 8u IPv4 11294 0t0 TCP localhost:smux (LISTEN) sshd 1814 root 3u IPv4 11330 0t0 TCP *:ssh (LISTEN) sshd 1814 root 4u IPv6 11332 0t0 TCP *:ssh (LISTEN) ntpd 1822 ntp 16u IPv4 11366 0t0 UDP *:ntp ntpd 1822 ntp 17u IPv6 11367 0t0 UDP *:ntp ntpd 1822 ntp 18u IPv4 11377 0t0 UDP localhost:ntp ntpd 1822 ntp 19u IPv4 11378 0t0 UDP 10.10.141.41:ntp ntpd 1822 ntp 20u IPv6 11379 0t0 UDP localhost:ntp ntpd 1822 ntp 21u IPv6 11380 0t0 UDP [fe80::250:56ff:fe84:ffab]:ntp qpidd 1843 qpidd 10u IPv4 11498 0t0 TCP *:amqp (LISTEN) qpidd 1843 qpidd 11u IPv6 11499 0t0 TCP *:amqp (LISTEN) mysqld 2783 mysql 12u IPv4 17978 0t0 TCP *:mysql (LISTEN) |
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:
1 |
# lsof -Pni |
Sadece TCP port ve bağlantıları listelemek isterseniz de -iTCP parametresini kullanmanız gerekir.
1 |
# lsof -iTCP |
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.
1 |
# lsof -i :22 |
Komutun çıktısı aşağıdakine benzer olacaktır.
1 2 3 4 5 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1814 root 3u IPv4 11330 0t0 TCP *:ssh (LISTEN) sshd 1814 root 4u IPv6 11332 0t0 TCP *:ssh (LISTEN) sshd 5356 root 3r IPv4 57777293 0t0 TCP 10.10.141.41:ssh->192.168.134.18:61169 (ESTABLISHED) sshd 5466 root 3r IPv4 57804908 0t0 TCP 10.10.141.41:ssh->192.168.134.18:61777 (ESTABLISHED) |
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:
1 |
# lsof -i :20-200 |
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.
1 |
# lsof -i @192.168.134.18 |
Örnek bir çıktı aşağıdakine benzer olacaktır.
1 2 3 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 5356 root 3r IPv4 57777293 0t0 TCP 10.10.141.41:ssh->192.168.134.18:61169 (ESTABLISHED) sshd 5466 root 3r IPv4 57804908 0t0 TCP 10.10.141.41:ssh->192.168.134.18:61777 (ESTABLISHED) |
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:
1 |
# lsof -u omer |
Hem cagri hem de root kullanıcısı tarafından açılan dosyaların listelenmesi için komut şu şekildedir.
1 |
# lsof -u omer,root |
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.
1 |
# lsof -u ^root |
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:
1 |
# lsof /var/log/messages |
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:
1 |
# lsof +d /var/log/ |
/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:
1 |
# lsof +D /var/log/ |
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.
1 |
# lsof /dev/sda1 |
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.
1 |
# lsof -p 18828 |
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:
1 |
# lsof -c bash |
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:
1 |
# lsof -i @85<b>.</b>105<b>.</b>168.65 -a -i :80 |
-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.
1 |
# lsof -i @85.105<b>.</b>168.65 -a -i :80 |grep ESTABLISHED |
-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:
1 |
# lsof -u cagri -a +D /usr/lib/ |
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:
1 |
# kill -HUP `lsof -t -c sshd -a -u cagri -a -i @192<b>.</b>168<b>.</b>12.12` |
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 ?