最近發現一個 Linux 環境中比較有用的查看系統網絡連接的命令 lsof ,這里記錄下 lsof 命令的網絡連接查詢功能(其主要原理是通過查詢與網絡連接相關的文件信息來獲取連接信息)。本文主要內容來自 lsof 命令的 manpage。
lsof 命令
lsof 命令的 -i 參數用於指定進行查詢的網絡連接的參數,其形式如下所示。
lsof -i [46][protocol][@hostname|hostaddr][:service|port] //losf 命令查看網絡連接的使用格式
注意上述參數均為可選參數,其中各個參數的具體解釋如下所示:
46 //4 和 6 分別用於指定進行查詢的 IP 地址的版本,即 -i4 使用 IPv4 進行查詢,而 -i6 使用 IPv6 進行查詢,不指定上述參數時,則對所有支持的 IP 地址進行查詢。 protocol //協議,用於指定進行查詢的網絡連接所使用的協議,即 TCP 或 UDP hostname //主機名,用於指定查詢所有與 hostname 對應網絡主機名相關的網絡連接 hostaddr //主機地址,通過 IP 地址形式給出的進行查詢的地址信息,該地址信息應與前面指定的 IP 版本對應 service //服務,用於指定查詢網絡連接所支持的服務, /etc/services 文件中記錄所有有效的服務名 port //端口,指定查詢的連接所使用的端口
以上參數中,再指定 hostname 或 hostaddr 時必須加上 '@',而指定 service 和 port 時則必須加上 ':' .用戶可以指定多個 service 和 port,只需通過 ',' 進行隔開,同時也可以通過 '-' 指定端口號范圍,如指定 1000 到 2000 端口號即為 "1000-2000". 通過執行 lsof 命令,用戶可以查詢獲得使用某個特定服務/端口/地址的網絡連接的信息,包括其 PID 進程號,其執行的具體命令和使用的協議等。
下面通過使用實例來說明 lsof 命令的使用方式,記住與網絡相關的參數需要通過 -i 參數進行指定。
1.查詢特定端口如 5090 端口是否被占用( 即查看當前是否有連接使用 5090 端口 )
lsof -i:5090 //查看 5090 端口的連接情況
2.查看與 127.0.0.1 相關的 tcp 連接情況
lsof -i tcp@127.0.0.1 //顯示與 127.0.0.1 相關的 tcp 連接的情況
3.查看系統上 https 服務的連接情況
lsof -i :https //顯示 https 服務相關的連接
實際上,lsof 命令的功能遠不止於查詢網絡連接。該命令的在 man lsof 中的解釋為列舉打開的文件( list open files ).由於 Linux 環境中普通文件( regular file ),流( stream ) 和網絡文件( 包括套接字(socket), 網絡文件系統(NFS)等)均以文件的形式處理,故而 lsof 可以實現相當強大的查詢功能。上面對 lsof 命令對網絡連接的查詢即主要基於對網絡文件的查詢來完成。
這里通過命令實例的形式介紹下 lsof 的簡單用法。更多的細節可以參考 lsof 的 manpage,通過命令行命令 man lsof 查看。
1.使用 -c string 參數指定列舉以 string 作為開始字符的命令所對應的文件的信息。下列命令即列舉所有以字符 b 作為開始字符的命令所對應的信息。用戶可以看到系統上存在多個運行 bash 命令的進程。
lsof -c b //列舉所有執行以字符 k 開頭的命令( command ) 進程
2.使用 -u user 參數指定列舉所有用戶名為 test 或者 root 的相關進程。
lsof -u test,root //列舉所有與用戶 test 相關的文件信息
3.在默認情況下,lsof 命令的各個參數之間的關系為 或(OR) 運算,也就是說同時指定 -u 和 -c 命令,則 lsof 會返回符合 -u 或 -c 參數的所有結果。用戶可以通過 -a 參數指定所有的參數使用 與(AND)運行,即同時指定 -a 參數后,lsof 只會返回同時符合所有參數要求的結果。
lsof -a -u root -i @127.0.0.1 //列舉所有屬於 root 用戶的與 127.0.0.1 相關的連接
其他
筆者主要通過 lsof 命令來查詢某個特定的端口是否正在被占用,並通過 kill 命令終止當前占用特定端口的進程。kill 命令的功能為向某個進程發送一個信號( signal ),所有可選的信號編號可通過 kill -L 進行查看。想要通過 kill 命令終止某個進程,只需向該進程發送 SIGKILL 信號,該信號的編號為 9,故而可以通過 kill -9 pid 的命令終止 pid 所對應的進程。
kill -L //輸出 kill 命令所支持的所有的信號 kill -9 12345 //終止進程 12345,實際為向進程 12345 發送 SIGKILL 信號