用 AI 写自动化脚本,误删服务器文件怎么办?
场景与原因
最近有朋友问我:用AI生成的shell脚本跑完后,发现 /www/wwwroot 下的项目文件夹全没了。
这种“AI写脚本误删文件”的情况并不少见——AI代码虽然能快速完成任务,但如果提示词没交代清楚,或测试不充分,很容易执行 rm -rf 之类的危险命令。遇到这种情况,第一件事不是重装系统,而是马上停止写入操作,然后按本文步骤尝试恢复。
恢复前的准备条件
- 确认文件系统:Linux服务器上常见的是 ext4。可通过
df -T /查看根分区类型。 - 准备恢复工具:优先使用
extundelete(适用于ext3/ext4),或者服务器有宝塔面板并开启了系统快照。 - 挂载方式:如果误删的分区不是系统盘,最好将其卸载或以只读模式重新挂载,避免新数据覆盖被删文件的磁盘块。
- 查看磁盘空间:执行
df -h确认磁盘还有空间存放恢复出来的文件(建议恢复到其他分区或移动硬盘)。
方法一:使用 extundelete 恢复
- 安装 extundelete(以CentOS/Ubuntu为例):
# CentOS
yum install -y epel-release && yum install -y extundelete
# Ubuntu
apt update && apt install -y extundelete
- 查找被删文件的位置:比如文件在 /www/wwwroot ,先确定该目录所在分区:
df /www/wwwroot
输出类似 /dev/vda1,这就是分区名。
- 恢复整个分区最近删除的文件:
extundelete /dev/vda1 --restore-all
恢复的文件会放到当前目录下的 RECOVERED_FILES 文件夹里。
- 如果知道文件名,可以用
--restore-file指定:
extundelete /dev/vda1 --restore-file /www/wwwroot/index.php
- 检查恢复结果:
ls -l RECOVERED_FILES/看看文件是否完整。注意:extundelete 对刚刚删除且未被覆盖的文件成功率较高,如果磁盘写入量大,恢复可能不完整。
方法二:借助宝塔面板系统快照
如果你的服务器是云厂商(如阿里云、腾讯云)创建的,并且开启了自动快照,回滚快照是最省事的方法。
- 登录云厂商控制台,找到云服务器实例。
- 点击“快照”或“备份”,选择一个误删前的时间点。
- 执行“回滚磁盘”操作。注意:回滚会丢失快照之后的所有数据,建议先确认是否需要新数据。
- 回滚后重新挂载磁盘,检查文件是否恢复。
如果用了宝塔面板自带的宝塔备份功能,可以在“宝塔面板 → 软件商店 → 宝塔备份”中找到备份记录,直接还原网站或数据库。
避坑指南与高频问题
- 误删后千万别再往该分区写数据:任何写入(包括安装extundelete本身)都可能覆盖被删文件。建议把extundelete装在其他分区,或用
--output指定恢复目录到另一块磁盘。 - 文件被覆盖了还能恢复吗?:如果文件的数据块已被新数据占用,通常无法完整恢复。这就是为什么恢复前要马上停止写入。
- 没有备份也没有快照怎么办?:使用
extundelete是最后一道防线,但恢复成功率取决于被删后的写入量。可以先用extundelete --inode查看分区inode表,确认文件是否还在。 - AI脚本为什么会误删?:常见原因是AI生成的命令中用了绝对路径且使用
rm -rf,或者循环语句未限制范围。解决方案:执行AI脚本前,先逐行审查危险命令,最好在测试环境或带有--dry-run选项的模拟模式下运行。
效果验证与后续建议
恢复完成后,执行以下步骤验证:
- 检查网站是否正常访问:
curl -I http://你的域名,看HTTP状态码。 - 检查数据库是否完整:登录phpMyAdmin或宝塔面板数据库管理,查看表记录数。
- 对比文件md5值(如果有备份的md5记录):
md5sum 文件路径核对。
长期建议:1. 养成定期备份习惯(建议每日自动备份到远程对象存储);
2. 在AI脚本中强制加入“确认删除”的交互逻辑;
3. 关键服务器开启“回收站”机制(如宝塔面板的文件回收站功能,或配置 trash-cli 替代 rm)。
这样即使AI脚本写错了,也能从容找回文件。