不小心执行 rm -f,先别着急跑路

本文介绍在Linux环境下,如何在误删文件后利用lsof和I/O重定向等技术进行文件恢复的过程及原理。当文件被删除但仍有进程打开时,可通过恢复数据实现文件复原。

作者:justmine

www.cnblogs.com/justmine/p/10359186.html

前言

每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug,呵呵。

那么如果真的删除了不该删除的文件,比如数据库、日志或执行文件,咋办呢?欲知后事如何,请仔细看完本篇博客。

模拟场景

1、删除

误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件:

> rm -f /root/selenium/Spider/MySql.Data.dll
> ll /root/selenium/Spider/MySql.Data.dll
ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory

2、恢复

(1)、使用 lsof 命令查看当前是否有进程打开 /root/selenium/Spider/MySql.Data.dll文件:

> lsof | grep /root/selenium/Spider/MySql.Data.dll

从上面可以看出,当前文件状态为已删除(deleted)。

(2)、查看是否存在恢复数据:

/proc/13067/fd:进程操作的文件描述符目录。
86:文件描述符。

> cat /proc/13067/fd/86

(3)、使用I/O重定向恢复文件

> cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll
> ls -l /root/selenium/Spider/MySql.Data.dll
-rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll

重新运行程序:

说明恢复的文件没有问题。

刨根问底

通过前面的模拟场景演示了恢复文件的整个过程,那么原理是什么,在什么情况下,文件才是可恢复的。

在Linux系统中,每个运行中的程序都有一个宿主进程彼此隔离,以/proc/进程号来体现(Linux本质上就是一个文件系统),比如:ls -l /proc/13067 查看进程PID为13067的进程信息;当程序运行时,操作系统会专门开辟一块内存区域,提供给当前进程使用,对于依赖的文件,操作系统会发放一个文件描述符,以便读写文件,当我们执行 rm -f 删除文件时,其实只是删除了文件的目录索引节点,对于文件系统不可见,但是对于打开它的进程依然可见,即仍然可以使用先前发放的文件描述符读写文件,正是利用这样的原理,所以我们可以使用I/O重定向的方式来恢复文件。

总结

如果不小心误删了文件,不要着急,首先使用 lsof 查看打开该文件的进程,然后再使用 cat /proc/进程号/fd/文件描述符 查看恢复数据,最后使用I/O重定向的方式来恢复文件。

精选文章

Java 全套学习资料分享

Mac 超详细入门指南,收藏了!

漫画:IT人的大阅兵,十分精彩!

漫画:程序员真是太太太太太有趣了!

程序IT圈

如果有帮助,请点个“在看”支持!

`rm -rf` 是 Linux 系统中一个非常危险的命令,其作用是以递归方式强制删除指定目录及其内容,且会提示用户确认操作。该命令一旦执行,数据几乎无法恢复,尤其是在误操作或权限过高的情况下,可能导致系统崩溃、服务中断甚至数据永久丢失。 ### `rm -rf` 命令的危险性 1. **无提示删除** `rm -rf` 中的 `-r` 表示递归删除目录及其内容,`-f` 表示强制删除,会提示用户确认,即使文件被锁定或只读也会尝试删除。 2. **权限过高导致灾难性后果** 如果在具有管理员权限(如使用 `sudo`)的环境下执行此命令,可能会删除系统关键文件,导致操作系统无法启动或服务崩溃。 3. **误删数据库文件** 数据库文件通常以文件形式存储在磁盘上,一旦被 `rm -rf` 删除,数据库将无法恢复,除非有完整的备份。 4. **误操作案例频发** - 曾有前端开发人员在上传代码时,误用 `rm -rf` 删除了整个网站目录,导致服务中断[^2]。 - 有公司因新员工误删数据库,而备份文件损坏或过期,最终造成项目组瘫痪[^3]。 - 某组内服务器因多人共用账户且拥有 `sudo` 权限,导致误删系统文件,服务器崩溃[^1]。 ### `rm -rf` 的典型误操作场景 - **误删系统目录** 如执行 `sudo rm -rf /` 或误将路径写错为 `/` 开头的目录,可能删除整个系统文件。 - **误删项目目录** 在部署或维护时,误将 `rm -rf` 后接错路径参数,导致整个项目被删除。 - **误删数据库目录** 若数据库(如 MySQL、PostgreSQL)的数据目录被误删,则整个数据库将无法恢复,除非有备份。 ### 防范措施 1. **限制用户权限** 避免所有用户拥有 `sudo` 权限,使用最小权限原则进行操作。 2. **使用安全替代命令** 可使用 `rm -i`(交互式删除)或 `trash-cli` 等工具替代 `rm -rf`,避免误删重要文件。 3. **定期备份数据库和关键文件** 确保备份机制有效运行,并验证备份文件的完整性。 4. **配置命令别名** 在 `.bashrc` 或 `.zshrc` 中设置别名,如 `alias rm='rm -i'`,防止误用 `rm`。 5. **使用版本控制** 对代码和配置文件使用 Git 等版本控制工具,降低误删风险。 6. **教育与培训** 对新员工或非系统管理员进行基础 Linux 命令培训,增强安全意识。 ### 示例:误删数据库后的恢复尝试 假设数据库目录为 `/var/lib/mysql`,若被误删,可尝试以下步骤(前提是存在备份): ```bash # 停止数据库服务 sudo systemctl stop mysql # 恢复备份(假设备份为 /backup/mysql.tar.gz) sudo tar -xzf /backup/mysql.tar.gz -C /var/lib/mysql # 更改权限 sudo chown -R mysql:mysql /var/lib/mysql # 启动数据库服务 sudo systemctl start mysql ``` 若无备份,恢复将极其困难,需依赖专业数据恢复工具(如 `extundelete`),但成功率极低。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值