0x00 前言

      lsof(list open files  ~~~ “ls + of”的组合)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
0x01 
  lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。
lsof语法格式是: lsof [options] filename

常用的参数列表
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况


lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6,例如 -i 4 或者 -i 6 
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个),例如lsof -i 4  1.1.1.1@110-135

0x02 实践

1、列出某个用户打开的文件

# lsof -u user_name  例如root@kali:~# lsof -u root ,lsof -u ^root查看非root用户的文件使用情况

2、列出在某个端口运行的进程

# lsof -i :port_number 例如root@kali:~# lsof -i:9392,root@kali:~# lsof -i:100-10000,root@kali:~# lsof -i:9392,9293,33218

3、根据进程名称列出打开的文件

# lsof -c process_name 例如root@kali:~# lsof -c ssh ,root@kali:~# lsof -a -c ssh -u root可以组合查询root用户的SSH

4、列出所有网络连接

#lsof -i 例如root@kali:~# lsof -i ,root@kali:~# lsof -i TCP,root@kali:~# lsof -i  TCP@localhost,

root@kali:~# lsof -i TCP@127.0.0.1:ssh,http  , root@kali:~# lsof -i TCP@127.0.0.1:100-1000000

5、根据进程id来列出打开的文件

# lsof -p PID  例如root@kali:~# lsof -p 9371,root@kali:~# lsof -i -a -p 9371 ,root@kali:~# lsof `which httpd` (哪个进程在使用apache的可执行文件)

6、 列出某个目录中被打开的文件

# lsof +D path_of_the_directory 例如 root@kali:~# lsof +D /var/log/

7、杀掉某个用户的所有活动进程

# killall -9 `lsof -t -u username` 例如root@kali:~#kill -9 `lsof -t -u root`(谨慎:如果是单一用户,这命令一敲就黑屏了)

8、恢复删除的文件

 第一步:lsof查看---当前是否有进程打开/var/logmessages文件,如下: # lsof |grep /var/log/messages

syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
第二步:获取信息--从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2,/var/log/messages已被标记删除了。

第三步:因此我利用 I/O 重定向查看 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)的同时恢复该文件。

cat /proc/1283/fd/2 > /var/log/messages



欢迎大家分享更好的思路,热切期待^^_^^ !!!

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:1 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐