天天看點

lsof指令使用

安裝lsof

[[email protected]_k ~]# yum -y install lsof

lsof簡介

lsof(list open files)是一個列出目前系統打開檔案的工具。在Unix中一切(包括網絡套接口)都是檔案。

下面的一些其它東西需要牢記:

預設 : 沒有選項,lsof列出活躍程序的所有打開檔案

組合 : 可以将選項組合到一起,如-abc,但要當心哪些選項需要參數

  • -a : 結果進行“與”運算(而不是“或”)
  • -c string 顯示COMMAND列中包含指定字元的程序所有打開的檔案
  • -u username 顯示所屬user程序打開的檔案
  • -d FD 顯示指定檔案描述符的程序
  • +d /DIR/ 顯示目錄下被程序打開的檔案
  • +D /DIR/ 同上,但是會搜尋目錄下的所有目錄,時間相對較長
  • -l : 在輸出顯示使用者ID而不是使用者名
  • -h : 獲得幫助
  • -t : 僅擷取程序ID
  • -U : 擷取UNIX套接口位址
  • -F : 格式化輸出結果,用于其它指令。可以通過多種方式格式化,如-F pcfn(用于程序id、指令名、檔案描述符、檔案名,并以空終止)
[[email protected]_k proc]# lsof | head
COMMAND     PID   USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
init             root  cwd       DIR              ,                 /
init             root  rtd       DIR              ,                 /
init             root  txt       REG              ,         /sbin/init
init             root  DEL       REG              ,               /lib64/libnss_files-..so
init             root  DEL       REG              ,               /lib64/libc-..so
init             root  mem       REG              ,          /lib64/libgcc_s-..-.so.
init             root  DEL       REG              ,               /lib64/librt-..so
init             root  DEL       REG              ,               /lib64/libpthread-..so
init             root  mem       REG              ,         /lib64/libdbus-.so...
           
COMMAND 程序的名稱
PID 程序辨別符
USER 程序所有者
FD 檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等
TYPE 檔案類型,如DIR、REG等
DEVICE 指定磁盤的名稱
SIZE 檔案的大小
NODE 索引節點(檔案在磁盤上的辨別)
NAME 打開檔案的确切名稱

擷取網絡資訊

-i 顯示所有的連接配接

[root@miner_k ~]# lsof -i
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient     root    u  IPv4        0t  UDP *:bootpc 
sshd        root    u  IPv4        0t  TCP *:ssh (LISTEN)
sshd        root    u  IPv6        0t  TCP *:ssh (LISTEN)
httpd       root    u  IPv6       0t  TCP *:http (LISTEN)
httpd     daemon    u  IPv6       0t  TCP *:http (LISTEN)
httpd     daemon    u  IPv6       0t  TCP *:http (LISTEN)
           

-i4 擷取IPV4的連接配接

[root@miner_k ~]# lsof -i4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient   root    u  IPv4        0t  UDP *:bootpc 
sshd      root    u  IPv4        0t  TCP *:ssh (LISTEN)
sshd      root    u  IPv4       0t  TCP .:ssh->.: (ESTABLISHED)
           

-itcp 顯示tcp的連接配接

[root@miner_k ~]# lsof -itcp
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd       root    u  IPv4        0t  TCP *:ssh (LISTEN)
sshd       root    u  IPv6        0t  TCP *:ssh (LISTEN)
httpd      root    u  IPv6       0t  TCP *:http (LISTEN)
httpd    daemon    u  IPv6       0t  TCP *:http (LISTEN)
           

-i :port 顯示端口的連接配接

[root@miner_k ~]# lsof -i :22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     root    u  IPv4        0t  TCP *:ssh (LISTEN)
sshd     root    u  IPv6        0t  TCP *:ssh (LISTEN)
sshd     root    u  IPv4       0t  TCP .:ssh->.: (ESTABLISHED)
           

基于主機和端口的連接配接

[root@miner_k ~]# lsof -i @192.168.6.104:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     root    u  IPv4       0t  TCP .:ssh->.: (ESTABLISHED)
           

找出監控狀态或已經建立連接配接狀态的程序

[root@miner_k ~]# lsof -i | grep -i listen
sshd        root    u  IPv4        0t  TCP *:ssh (LISTEN)
sshd        root    u  IPv6        0t  TCP *:ssh (LISTEN)
httpd       root    u  IPv6       0t  TCP *:http (LISTEN)
httpd     daemon    u  IPv6       0t  TCP *:http (LISTEN)


[root@miner_k ~]# lsof -i | grep -i establish
sshd        root    u  IPv4       0t  TCP .:ssh->.: (ESTABLISHED)
           

通過使用者名稱查詢相關的程序

檢視指定使用者打開的程序

[[email protected]_k ~]# lsof -u mysql
COMMAND   PID  USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
mysqld   mysql  cwd    DIR              ,        /var/lib/mysql
mysqld   mysql  rtd    DIR              ,              /
mysqld   mysql  txt    REG              ,   /usr/local/mysql--linux-glibc2-x86_64/bin/mysqld
mysqld   mysql  mem    REG              ,      /lib64/libresolv-.so
mysqld   mysql  mem    REG              ,       /lib64/libnss_dns-.so
mysqld   mysql  mem    REG              ,       /lib64/libnss_files-.so
           

檢視除了某個使用者打開的程序

[[email protected]_k ~]# lsof -u ^root | head
COMMAND   PID   USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
httpd    daemon  cwd    DIR              ,              /
httpd    daemon  rtd    DIR              ,              /
httpd    daemon  txt    REG              ,     /usr/local/apache/bin/httpd
httpd    daemon  mem    REG              ,       /lib64/libnss_dns-.so
httpd    daemon  mem    REG              ,       /lib64/libnss_files-.so
httpd    daemon  mem    REG              ,      /lib64/libselinux.so
httpd    daemon  mem    REG              ,      /lib64/libresolv-.so
           

殺掉某一使用者運作的所有程序

[[email protected]_k ~]# kill -9 $(lsof -t -u mysql)

同時滿足多個選項

[root@miner_k ~]# lsof -a -u root -d txt
COMMAND     PID USER  FD      TYPE DEVICE SIZE/OFF    NODE NAME
init           root txt       REG  ,     /sbin/init
kthreadd       root txt   unknown                         /proc//exe
migration      root txt   unknown                         /proc//exe
ksoftirqd      root txt   unknown                         /proc//exe
stopper/      root txt   unknown                         /proc//exe
watchdog/      root txt   unknown                         /proc//exe
events/       root txt   unknown                         /proc//exe
           

恢複删除的檔案

當Linux計算機受到入侵時,常見的情況是日志檔案被删除,以掩蓋攻擊者的蹤迹。管理錯誤也可能導緻意外删除重要的檔案,比如在清理舊日志時,意外地删除了資料庫的活動事務日志。有時可以通過lsof來恢複這些檔案。 


    在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案。/proc目錄挂載的是在記憶體中所映射的一塊區域,是以這些檔案和目錄并不存在于磁盤中,是以當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。大多數與 lsof 相關的資訊都存儲于以程序的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的程序的資訊。每個程序目錄中存在着各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符清單、指向磁盤上的檔案的符号連結和其他系統資訊。lsof 程式使用該資訊和其他關于核心内部狀态的資訊來産生其輸出。是以lsof 可以顯示程序的檔案描述符和相關的檔案名等資訊。也就是我們通過通路程序的檔案描述符可以找到該檔案的相關資訊。 

    當系統中的某個檔案被意外地删除了,隻要這個時候系統中還有程序正在通路該檔案,那麼我們就可以通過lsof從/proc目錄下恢複該檔案的内容。 假如由于誤操作将/var/log/messages檔案删除掉了,那麼這時要将/var/log/messages檔案恢複的方法如下:
           

測試:

[root@miner_k /]# mv /var/log/messages{,.bak}
[root@miner_k /]# lsof | grep /var/log/messages
rsyslogd      root    w      REG              ,          /var/log/messages

[root@miner_k /]# cat /proc//fd/ > /var/log/messages
messages-gz  messages.bak          
[root@miner_k /]# cat /proc//fd/ > /var/log/messages
           

繼續閱讀