安裝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