如何识别exec创建的文件描述符对应命令及历史清空后的排查方法
文件描述符追踪相关问题
使用以下命令可创建文件描述符:
exec 77> /home/admin/somefile
但通过lsof查看时,仅能看到所属进程为bash:
admin@i-0a8158ef4cb3362f5:~$ lsof somefile COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 811 admin 77w REG 259,1 0 272875 somefile admin@i-0a8158ef4cb3362f5:/proc/811$ ls -l fd total 0 lrwx------ 1 admin admin 64 Aug 10 12:30 0 -> /dev/pts/0 lrwx------ 1 admin admin 64 Aug 10 12:30 1 -> /dev/pts/0 lrwx------ 1 admin admin 64 Aug 10 12:30 2 -> /dev/pts/0 lrwx------ 1 admin admin 64 Aug 10 12:30 255 -> /dev/pts/0 l-wx------ 1 admin admin 64 Aug 10 12:30 77 -> /home/admin/somefile
问题1:是否有办法找到创建该文件描述符的具体命令,而非仅显示bash?
- 常规工具(如
lsof、/proc/[pid]/fd)只能定位到持有文件描述符的进程(此处为bash),无法直接获取创建它的具体exec命令。因为exec是bash内置命令,执行后文件描述符属于bash进程本身,系统不会单独记录该描述符的创建命令。 - 若要实现追踪,只能提前配置监控:
- 启用
auditd并添加规则,监控文件的打开操作或execve系统调用,可记录触发文件描述符创建的命令详情。 - 在bash中提前开启调试模式(
set -x),但此操作需事前配置,事后无法补做。
- 启用
问题2:若有人执行该exec命令后清空了命令历史,如何确认该命令是否被执行?
可通过以下方式验证:
- 检查目标进程的
/proc/[pid]/fd目录:如示例所示,查看对应bash进程的fd目录,若存在指向目标文件的文件描述符(如示例中的77),则说明该进程确实打开了此描述符,结合场景可推断是exec命令创建。 - 查看系统审计日志(若
auditd已启用):若事前配置了审计规则,日志会记录该文件的打开操作、对应进程及用户信息,即使命令历史被清空,审计日志仍可提供证据。 - 检查bash历史文件备份:部分系统会自动备份bash历史(如
~/.bash_history~等隐藏备份文件),可查看这些备份是否有残留命令记录。 - 结合文件和进程状态推断:若该文件描述符被后续操作使用过(如写入内容),可通过文件修改时间、内容,以及进程的活动时间间接推断命令是否执行。
内容的提问来源于stack exchange,提问作者Kavish Gour
相关产品推荐
相关产品推荐

