数据恢复(三)-linux快速查找最近被删除的文件
xsobi 2025-01-10 18:07 1 浏览
上周溯源某挖矿case,在排查过程中发现挖矿文件被人为删除。最终通过确定文件被删除的时间以缩小排查ssh登录的时间范围从而锁定了可疑ip。该case引发了我的思考,linux下如何查找最近被删除的文件?本文是数据恢复的第三篇文章,只是快速找到被删除文件,并不涉及如何恢复文件本身。
大家都知道文件有三个时间戳atime、mtime、ctime。但是在linux下文件还有crtime(创建时间)和dtime(删除时间)。通过dtime可以查找最近被删除的文件,但由于inode可能被覆盖,该方法不一定完全准确。
如何查看文件的5个时间戳?
上面的操作中删除一个文件后,虽然文件的block指针被抹除,但被删除文件的indoe还在,并且写入了文件的被删除时间。
通过使用debugfs命令(linux自带用于内核调试的虚拟文件系统),获取文件的5个时间戳。关于linux文件删除的原理和debugfs的使用可以参考我之前的文章:数据恢复(一)-linux下ext文件系统数据删除原理浅析 。
如何快速定位哪些目录中的文件被删除?
最常见的我们是通过find命令查找linux中文件的变动。因为linux下一切皆文件,目录本身也是一个文件。比如我们删除了一个目录中的文件,该目录的时间也会发送改变。
做一个简单的测试。原本tmp.873RCQOugw目录的mtime为2021-12-20,但是我们删除该目录中的一个文件之后,该目录的mtime变为了现在的时间。
所以可以使用find命令查找存在文件变动的目录,这样可以避免全盘扫描,节省更多的时间。
有哪些可实现的思路?
我一开始想到了两种方式。
- 直接从磁盘上读取所有文件的indoe信息,通过比较文件的dtime是否为空判断该文件是否被删除。这种方式比较硬核,需要解析inode表的数据结构,实现相对麻烦,但不会有任何遗漏。
- 通过find命令配合debugfs获取文件dtime,只需编写shell脚本即可实现,相对简单很多。不过可能会出现部分遗漏(比如文件名中包含空格导致解析失败)。
为快速验证我的想法,最终采用了第二种方式实现。
shell脚本实现
linux快速查找最近被删除的文件,我的脚本代码如下:
#!/bin/bash
tempDir=$(mktemp -d)
# 获取主分区
mainPartition=$(df -Th | awk '$NF=="/"{print $1}')
echo "正在扫描3天内发生变动的文件夹"
recentChangedDirs=$(find / -maxdepth 5 \( -path /proc -o -path /run -o -path /sys \) -prune -o -mtime -3 -type d )
for dir in $recentChangedDirs; do
debugfs -w $mainPartition -R "ls -d $dir" 2>/dev/null | \
xargs -n3 2>/dev/null | awk '/<[0-9]+>/{print $1,$NF}' 2>/dev/null | \
while read inum fileName
do
realPath=$dir/$fileName
inodeInfo=$(debugfs -w $mainPartition -R "stat $inum" 2>/dev/null )
if echo $inodeInfo | grep -q "dtime"; then
crtime=$(echo $inodeInfo| grep -oE "crtime:.*? [0-9]{4} d")
dtime=$(echo $inodeInfo| grep -oE "dtime:.*? [0-9]{4}")
echo -en "检测到被删除的文件:$realPath\n该文件的创建时间为:$crtime\n该文件的删除时间为:$dtime\n\n" | tee -a $tempDir/deleteFile.log
else
echo -en "被删除文件$realPath的inode已被其他文件覆盖!无法获取被删除时间\n" | tee -a $tempDir/deleteFile.log
fi
done
done
echo -e "\n\n文件删除信息已保存至:$tempDir/deleteFile.log"
效果如下:
脚本放在了我博客上,可以curl测试效果。
curl -sL https://zgao.top/download/scanDeletedFiles.sh | sh
存在的问题?
inode被其他文件覆盖后,虽然还能看到被删除的文件名,但是已经看不到被删除文件的几个时间戳。(注意:这里说的是inode覆盖,不是block覆盖,inode被覆盖不代表文件的真实内容被覆盖)
已上图中的 被删除文件/usr/local/qcloud/YunJing/log/ydservice.20220311.log的inode已被其他文件覆盖!无法获取被删除时间 为例。
此时虽然还能找到被删除的文件名,但是从indoe中获取到的已经是新文件的信息了。
相关推荐
- bootstrap入门
-
bootstrap是一个前端ui框架,它把我们网页开发常用的功能都写好了,我们使用它可以像搭积木一样的轻松的开发网站,不过现在都流行前后端分析了,而且layui也比较好用,个人觉得无论哪个ui框架,我...
- BootStrap简介及应用要点
-
BootStrap简介BootStrap是基于HTML、CSS和JavaScript的框架,使你只需要写简单的代码就可以很快的搭建一个还不错的前端框架,他是后端程序员的福音,使它们只需要专注业务逻辑,...
- 如何在Bootstrap Studio中使用图标字体?
-
BootstrapStudioforMac是一款网站设计制作工具,图标字体类似于普通的Web字体,但是它们包含矢量形状,而不是字母和数字。那么如何在BootstrapStudio中使用图标字体...
- Bootstrap5.0-全球流行的前端开源UI工具包迎来了大版本更新
-
Bootstrap5.0正式发布了,带来了很多亮点,还学得动吗?Bootstrap介绍...
- BootstrapBlazor 模板适配移动设备使用笔记
-
项目模板BootstrapBlazorApp模板为了方便大家利用这套组件快速搭建项目,作者制作了项目模板(ProjectTemplates),使用dotnetnew命令行模式,使用步骤...
- bootstrap的tab标签页的使用
-
标签tab页在,当前的web中应用十分广泛,君不见,在博客的右侧出现的最新文章和随机文章中有它的身影,在大型门户网站中也有它的身影,可以说其无处不在的刷着存在感。既然其如此嚣张的存在,我们没有理由不应...
- 使用 Bootstrap 的最简单方法 - 让你的 HTML 看起来赏心悦目
-
什么是BootstrapBootstrap是一个免费的开源CSS框架,使得前端Web开发变得更加简单。...
- Bootstrap-table 使用总结
-
一、什么是Bootstrap-table?在业务系统开发中,对表格记录的查询、分页、排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这...
- 建议收藏:哪些电子发票有XML格式?
-
报销时,财务要求提供发票XML格式。但不是所有的电子发票都有哦,目前只有数电发票(全面数字化的电子发票)有XML格式!目前的数电发票有下面这几大类:1、电子发票(增值税专用发票):适用于增值税一般纳税...
- Mybatis中mapper的xml解析详解
-
上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。基础介绍回顾下之前是在分析configur...
- word修改文中任意一处文字,其他地方相同的内容自动修改
-
我们工作写方案处理word的时候,经常会遇到这么一种情况,即文中存在多处相同的文字内容,可能是词语,也可能是段落。当我们修改了其中一处后,其他地方还得手动修改,十分不便。今天给大家分享一下,在word...
- 第9天 | 鸿蒙App开发实战,XML创建布局,共性很重要
-
XML声明布局的方式更加简便直观,是开发App的核心内容之一,咱们完全有必要搞清楚。每一个Component和ComponentContainer对象大部分属性都支持在XML中进行设置,它们有各自的X...
- 可扩展标记语言格式XML
-
1,XML(eXtensibleMarkupLanguage):指可扩展标记语言,一种数据表示格式,被设计用来传输和存储数据,不用于表现和展示数据。2,XML和基于XML的语言的整个结构是...
- 比较一下JSON与XML两种数据格式?
-
JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...
- PROFINET工业以太网教程(16)-GSDML文件详解
-
前面的文章(PROFINET工业以太网教程(10)——GSD文件)我们介绍过GSD文件,它的全称是“GeneralStationDescription”,中文翻译为“通用站描述文件”。GSD文件的...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- firebug 使用 (31)
- characterencodingfilter (33)
- getmonth (34)
- hibernate教程 (31)
- label换行 (33)
- curlpost (31)
- android studio 3 0 (34)
- android应用开发 (31)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- localhost 8080 (32)
- 多态 (32)
- xmlhttp (35)
- mysql更改密码 (34)