前言
一提到在 linux 环境下删除文件,那绝对离不开 sudo rm -rf /*
这个梗,每次看到这个命令,我都想到一幅恶搞的图片:
这个『清理垃圾』的说明真是解释的“恰到好处”,据说有小白在论坛问问题,被人开玩笑的回复了 sudo rm -rf /*
这个命令,结果问题就解决了,人也拜拜了~
从删库到跑路,一天一个入狱小技巧,所以我们一定要谨慎使用 rm -rf
命令,这相当于我们在 Windows 上使用 Shift+Delete
组合,文件不会放到回收站中,而是直接永久删除了,在 Linux 中执行 rm
命令就相当于永久删除。
虽说 sudo rm -rf /*
危险无比,但是我们很少会直接这样写,但是 rm
命令还是经常用的,这不就在前几天,辛辛苦苦写的Shell脚本就被我直接 rm -rf
删掉了,幸亏我之前将内容打印到了控制台,否则整个脚本就白写了。
rm之后还有救吗
尽管 rm
命令表示永久删除,但是不代表文件就一定找不回来,只是找回的几率有大有小。其实删除命令只是在文件节点中作删除标记,并不真正清除文件内容,如果删除后马上进行恢复,那么成功的概率还是很大的,但是如果其他用户一直在用这台机器,或者有一些写盘操作的进程一直在执行,那么这部分数据可能很快就会被覆盖。这时基本上就无法恢复该文件了。
使用foremost找回文件
foremost
是一个基于文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具,接下来是安装和恢复的步骤:
- 安装
foremost
CentOS系统直接运行 sudo yum install https://forensics.cert.org/centos/cert/7/x86_64//foremost-1.5.7-13.1.el7.x86_64.rpm -y
命令就可以完成
如果是Ubuntu系统请尝试命令:
sudo apt install foremost
1 | [root@VM-0-3-centos ~]# sudo yum install https://forensics.cert.org/centos/cert/7/x86_64//foremost-1.5.7-13.1.el7.x86_64.rpm -y |
- 创建一个测试文件
1 | [root@VM-0-3-centos ~]# echo "this is a important file">important.txt |
- 删除文件后尝试还原
1 | [root@VM-0-3-centos ~]# rm important.txt |
- 执行几分钟之后崩溃,恢复失败,打开目录查看发现:
1 | [root@VM-0-3-centos ~]# ls /tmp/restore/ |
- 看来与需要恢复的文件类型有关,换台机器再换一个png文件试试,先找一个showball.png测试文件,然后确认分区
/dev/vda1
1 | [root@VM-0-3-centos ~]# df |
- 删除png文件后尝试恢复,进度条结束后即可进入指定的目录
/root/restore/
查看
1 | [root@VM-0-3-centos ~]# rm showball.png |
- 在指定目录下会有一个
audit.txt
统计文件和一个类型文件夹png
1 | [root@VM-0-3-centos ~]# ll restore/ |
- png目录下的文件名都是一些编号,与原来删除的文件完全不一样了,需要根据 audit.txt 文件确认,打开文件确认一下:
1 | [root@VM-0-3-centos restore]# head audit.txt |
- audit.txt 文件中记录着恢复文件的简要信息,这需要你知道原来删除文件的相关信息,不然就只能一个个打开查看了,我是通过分辨率查找的
1 | [root@VM-0-3-centos restore]# grep "1217" audit.txt |
- 根据过滤出的信息把
12888200.png
打开发现就是自己“误删”的文件这就恢复好了
使用extundelete找回文件
extundelete 支持ext3、ext4文件系统下的文件恢复,使用 cat /etc/fstab
可以在linux环境下查看文件系统类型
1 | [root@VM-0-3-centos ~]# cat /etc/fstab |
- 安装依赖文件
1 | [root@VM-0-3-centos ~]# yum install e2fsprogs-devel |
- 下载extundelete源码
1 | [root@VM-0-3-centos ~]# wget https://src.fedoraproject.org/repo/pkgs/extundelete/extundelete-0.2.4.tar.bz2/77e626ad31433680c0a222069295d2ca/extundelete-0.2.4.tar.bz2 |
- 解压extundelete源码
1 | [root@VM-0-3-centos ~]# tar -jxvf extundelete-0.2.4.tar.bz2 |
- 编译xtundelete源码安装
1 | [root@VM-0-3-centos extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install |
如果在这一步报错
configure: error: C++ compiler cannot create executables
,可以运行yum -y install gcc-c++
命令安装编译环境
- 准备测试文件
1 | [root@VM-0-3-centos examples]# df -T |
- 查询文件的inode信息
我们选择刚刚下载的extundelete源码包作为“误删”的文件,先查看一下信息,-li
可以在第一列查看文件的inode信息,examples文件夹的inode值为1311798:
1 | [root@VM-0-3-centos ~]# ls examples/ |
- 删除测试文件,并用查询信息
1 | [root@VM-0-3-centos ~]# cd examples/ |
我们发现 extundelete-0.2.4.tar.bz2 文件的状态为 `Deleted`
- 使用extundelete恢复文件
1 | [root@VM-0-3-centos ~]# /usr/local/extundelete/bin/extundelete /dev/vda1 --restore-directory /tmp |
恢复失败,此路不通!!!
有其他人成功了,但是我测试失败,释放内存崩溃,有大神给说一下怎么改源码吗?此处存疑,后续再测,先记录一下常用参数
- 查询inode文件状态:
/usr/local/extundelete/bin/extundelete /dev/vda1 --inode 1311798
- 恢复指定节点数据:
/usr/local/extundelete/bin/extundelete /dev/vda1 --restore-inode 1311798
- 恢复单个文件:
/usr/local/extundelete/bin/extundelete /dev/vda1 --restore-file root/examples/extundelete-0.2.4.tar.bz2
- 恢复一个目录:
/usr/local/extundelete/bin/extundelete /dev/vda1 --restore-files root/examples
- 恢复所有文件:
/usr/local/extundelete/bin/extundelete /dev/vda1 --restore-all
预防误删引发的事故
定义别名,提示删除
定义别名
alias rm='rm -i'
, 在删除文件前会出现一个提示,使用-i
选项来需要逐个确认要删除的文件,只有用户输入y
才会将文件删除,但是这种做法在加上-f
选项之后会失效。禁用rm,使用mv代替
在系统中不允许直接使用rm命令直接删除文件,需要mv文件到指定的回收目录 ~/.delete,然后配合一个定时任务,每周清空~/.delete下文件,相当于手动创建了一个回收站。
总结
- 使用foremost恢复时的目标目录最好是另外一个磁盘中的目录,把文件恢复到被删除文件所在的磁盘中很可能会在恢复前覆盖被误删的文件
sodu
的全称目前有substitute user do
和super user do
两种说法,使用sudo通常是行驶超级用户的权限,但有时也可以其他普通用户,所以翻译成substitute user do
代替其他用户来做更准确一点- foremost 支持的文件系统比较多,其中包括 ext2、 ext3 、vfat、NTFS、ufs、jfs 等,但是只能恢复特定格式的文件,而 extundelete 只支持ext3、ext4文件系统,不过可恢复的文件类型很多。
- 除了本文中总结的这两款不怎么好用的恢复软件,还有 testdisk 和 photorec 可以用来恢复,后续可以尝试一下
- 数据无价,请谨慎删除,可参考别名方法或禁用
rm -rf
来减少事故的发生
成年人,结果导向!没有功劳的苦劳是那么的虚弱无力~
2021-11-28 22:14:54