Linux系統診斷神器:lsof用法學起來!

lsof(list open files)是一個查看當前系統文件的工具。在linux環境下,任何事物都以文件的形式存在,用戶通過文件不僅可以訪問常規數據,還可以訪問網絡連接和硬件;如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP)套接字等,系統在後臺都為該應用程序分配了一個文件描述符,該文件描述符提供了大量關於此應用程序的信息。

本期,ISEC實驗室為大家詳解lsof的用法。

一、命令參數

-a:列出打開文件存在的進程;

-c:列出指定進程所打開的文件;

-g:列出GID號進程詳情;

-d:列出佔用該文件號的進程;

+d:列出目錄下被打開的文件;

+D:遞歸列出目錄下被打開的文件;

-n:列出使用NFS的文件;

-i:列出符合條件的進程(4、6、協議、:端口、 @ip );

-p:列出指定進程號所打開的文件;

-u:列出UID號進程詳情;

-h:顯示幫助信息;

-v:顯示版本信息。

二、實例講解

1、lsof輸出各列信息的意義,如下:

COMMAND:進程的名稱;

PID:進程標識符;

PPID:父進程標識符(需要指定-R參數);

USER:進程所有者;

PGID:進程所屬組;

FD:文件描述符,應用程序通過文件描述符識別該文件。

2、文件描述符列表:

①. cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改;

②. txt:該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序;

③. lnn:library references (AIX);

④. er:FD information error (see NAME column);

⑤. jld:jail directory (FreeBSD);

⑥. ltx:shared library text (code and data);

⑦. mxx :hex memory-mapped type number xx.

⑧. m86:DOS Merge mapped file;

⑨. mem:memory-mapped file;

⑩. mmap:memory-mapped device;

⑪. pd:parent directory;

⑫. rtd:root directory;

⑬. tr:kernel trace file (OpenBSD);

⑭. v86 VP/ix mapped file;

⑮. 0:表示標準輸出;

⑯. 1:表示標準輸入;

⑰. 2:表示標準錯誤。

3、一般在標準輸出、標準錯誤、標準輸入後,還跟著文件狀態模式:

①.u:表示該文件被打開並處於讀取/寫入模式;

②.r:表示該文件被打開並處於只讀模式;

③.w:表示該文件被打開並處於只寫模式;

④.空格:表示該文件的狀態模式為unknow,且沒有鎖定;

⑤.-:表示該文件的狀態模式為unknow,且被鎖定。

4、同時在文件狀態模式後面,還跟著相關的鎖:

①. N:for a Solaris NFS lock of unknown type;

②. r:for read lock on part of the file;

③. R:for a read lock on the entire file;

④. w:for a write lock on part of the file;(文件的部分寫鎖)

⑤. W:for a write lock on the entire file;(整個文件的寫鎖)

⑥. u:for a read and write lock of any length;

⑦. U:for a lock of unknown type;

⑧. x:for an SCO OpenServer Xenix lock on part of the file;

⑨. X:for an SCO OpenServer Xenix lock on the entire file;

⑩. space:if there is no lock。

5、文件類型

①. DIR:表示目錄;

②. CHR:表示字符類型;

③. BLK:塊設備類型;

④. UNIX:UNIX 域套接字;

⑤. FIFO:先進先出 (FIFO) 隊列;

⑥. IPv4:網際協議 (IP) 套接字;

⑦. DEVICE:指定磁盤的名稱;

⑧. SIZE:文件的大小;

⑨. NODE:索引節點(文件在磁盤上的標識);

⑩. NAME:打開文件的確切名稱。

三、可打開文件

①. 普通文件;

②. 目錄;

③. 網絡文件系統的文件;

④. 字符或設備文件;

⑤. (函數)共享庫;

⑥. 管道,命名管道;

⑦. 符號鏈接;

⑧. 網絡文件(例如:NFS file、網絡socket,unix域名socket);

⑨. 其它類型的文件等。

四、常規用法

lsof 常被用來查找應用程序打開的文件名稱和數目,系統管理員可能想嘗試找出某個特定應用程序將日誌數據記錄到何處,或者正在跟蹤某個問題。接下來,我們來看看是如何操作的:

1、進程篇

(1)、查看由登陸用戶啟動而非系統啟動的進程:

命令: lsof /dev/pts0

a. /dev/pts是遠程登陸(telnet,ssh等)後創建的控制檯設備文件所在的目錄;

b. 第一個用戶登陸,console的設備文件為/dev/pts/0,第二個為/dev/pts/1,以此類推;

c. 通過查看/dev/pts下的進程,我們將可以瞭解到由登陸用戶啟動而非系統啟動的進程有哪些。

(2)、查看文件,設備被哪些進程佔用:

命令:lsof /dev/tty1

<center>

a. /dev/tty就是當前進程的控制終端的設備特殊文件;

b. 通過查看/dev/tty下文件可以知道文件、設備的進程佔用情況。

(3)、指定進程號,可以查看該進程打開的文件:

命令:lsof -p 27358

<center>

a. 通過加入參數-p,我們可以指定一個PID,然後查看該進程下打開的文件。

b. 本例我們查看的是nginx下打開的相關文件。

2、文件篇

(1)、查看指定程序打開的文件

命令:lsof -c sshd

<center>

通過參數-c可以列出指定進程所打開的文件情況,以上是我們打開sshd下被打開文件的情況。

(2)、查看指定用戶打開的文件

命令:lsof -u root | more  

通過參數-u查看root用戶下存在的文件情況,由於root下顯示內容較多,可以利用more來限制,進行分頁查看。

(3)、查看指定目錄下被打開的文件

命令:lsof +D /home/ 或lsof +d /home/  

參數+D為遞歸列出/home/下被打開的文件,參數+d為列出/home/下被打開的文件。

3、網絡篇

(1)、查看所有網絡連接

命令:lsof -i 和 lsof -i@127.0.0.1  

通過參數-i查看網絡連接的情況,包括連接的ip、端口等;以及一些服務的連接情況,例如:sshd等。也可以通過指定ip查看該ip的網絡連接情況。

(2)、查看端口連接情況

命令:lsof -i :22

通過參數-i:端口可以查看端口的佔用情況,-i參數還有查看協議,ip的連接情況等。

4、綜合篇

(1)、查看指定進程打開的網絡連接

命令:lsof -i -a -p 1535  

<center>

使用了參數-i、-a、-p等,-i查看網絡連接情況,-a查看存在的進程,-p指定進程。

(2)、查看指定狀態的網絡連接

命令:lsof -n -P -i TCP -s TCP:ESTABLISHED  

參數解釋: -n:no host names, -P:no port names,-i TCP指定協議,-s指定協議狀態;通過多個參數我們可以清晰的查看網絡連接情況、協議連接情況等。

五、恢復被刪除的日誌

Linux的系統日誌默認保存在/var/log下

當Linux系統被入侵後,很多入侵者經常會刪除系統中的各種日誌,包括Web的access和error日誌、last日誌、messages日誌、secure日誌等,阻礙應急響應和取證調查,比如rm -rf /var/log。

遇到這種情況,不要關閉或者重啟服務器系統,也不要關閉或重啟相關服務或者進程,如:恢復apache的訪問日誌/var/log/httpd/access_log時,不能關閉或者重啟服務器系統,也不能重啟httpd服務。

假設我們要恢復被刪除的messages日誌和secure日誌:

1.首先通過losf命令找到使用messages文件的進程的PID和messages文件的FD(文件描述符);

從上面命令輸出可以看到,這個打開/var/log/messages文件的進程的PID是815,文件/var/log/messages的FD(文件描述符)是4,狀態為deleted,標記被刪除,但其實該文件並沒有從磁盤中刪除。

2.如果刪除的文件還存在操作的進程,數據將可能被找回,可以在/proc/815/fd/4找到被刪除的/var/log/messages文件;

3.恢復被刪除的/var/log/secure文件;

  

在Linux系統中刪除了一個文件,只要進程還在對文件進行操作,就可能還存在一個inode的引用:/proc/進程號/fd/文件描述符,只要知道當前打開文件的進程pid和文件描述符fd,即可利用lsof命令還原出被刪除的文件。

六、總 結

Linux大量使用了文件,作為系統管理員,lsof 允許用戶對核心內存進行查看,以找出系統當前如何使用這些文件。lsof的簡單用法可以告訴用戶哪些進程打開了哪些文件,以及哪些文件由哪些進程打開。

在收集關於應用程序工作情況的信息時,或在進行某些可能損壞數據的操作前,要確保文件未被使用,這一點特別重要。lsof 更高級的用法可以幫助用戶查找刪除的文件,並獲得關於網絡連接的信息。lsof 是一個功能強大的工具,它幾乎可以用於任何地方。