如何在Linux SFTP中恢复数据
小樊
32
2025-12-05 01:05:51
Linux SFTP数据恢复实用指南
一、先判断属于哪类“恢复”
- 文件被删除但仍有进程占用:通过 lsof 找到持有已删除文件的进程,从 /proc//fd/ 复制回文件描述符即可恢复。
- 文件已被删除且无进程占用:立刻停止对所在分区写入,使用文件系统级恢复工具(如 extundelete 针对 ext3/ext4,或 TestDisk 针对多文件系统)进行扫描与恢复。
- 只是传输中断或版本回退:直接用 SFTP 的 get/put -r 重新下载/上传所需目录或文件。
- 服务器迁移或整站回滚:从备份归档(如 tar.gz)解压恢复用户数据,并还原 /etc/ssh/sshd_config 后重启 sshd。
二、场景一 文件被删除但进程仍在
- 定位持有已删除文件的进程:运行 lsof | grep deleted,在输出中找到目标文件的 PID 与文件描述符(常见为 1=stdout、2=stderr、3+=其他)。
- 直接从进程文件描述符复制恢复:例如文件描述符为 1,执行 cp /proc//fd/1 /目标/恢复路径/文件名;若描述符为 3,则用 /proc//fd/3。
- 恢复后尽快停止相关进程或让其轮转日志,避免再次写入导致覆盖。
三、场景二 文件被删除且无进程占用
- 立刻“只读化”处理:停止写入相关服务,尽量对分区执行 umount;如提示设备忙,可用 fuser -m -v -i -k <挂载点> 结束占用后再卸载。对极其重要的数据,先做整盘/分区镜像备份(如 dd)再进行恢复操作。
- 使用 extundelete(ext3/ext4):
- 安装:在 Ubuntu/Debian 上执行 sudo apt-get update && sudo apt-get install extundelete。
- 恢复单文件:执行 sudo extundelete /dev/sdXY --restore-file 相对路径/文件名(如 /dev/sda1、相对路径为 home/user/file.txt)。
- 恢复结果默认在 ./RECOVERED_FILES/。
- 使用 TestDisk(多文件系统):
- 安装:在 Ubuntu/Debian 上执行 sudo apt-get update && sudo apt-get install testdisk。
- 恢复:运行 sudo testdisk,按向导选择磁盘与分区,执行“Undelete”并勾选需要恢复的文件/目录,指定输出目录保存。
- 重要提示:恢复成功率受文件系统类型、删除后写入量、磁盘使用率等影响;操作前务必停止写入,避免覆盖已删除数据。
四、场景三 通过SFTP重新下载或回滚版本
- 从远程恢复单个文件:在本地执行 scp user@host:/remote/file /local/dir/;或用 sftp 登录后执行 get /remote/file /local/dir/。
- 从远程恢复整个目录:使用递归传输,scp -r user@host:/remote/dir /local/dir/;或 sftp> get -r remote_dir local_dir。
- 回滚到旧版本:若旧版本仍在服务器上,可直接 get 旧文件/旧目录覆盖本地;若旧版本在本地备份,使用 put -r 上传覆盖远端。
五、场景四 迁移或整站回滚的“恢复”
- 备份与恢复用户数据:将 /home 打包为归档(如 tar -czvf /backup/home.tar.gz /home),在新服务器解压到 /(如 tar -xzvf /backup/home.tar.gz -C /)。
- 备份与恢复 SFTP 配置:备份 /etc/ssh/sshd_config,迁移后拷回并按需调整(如 Subsystem sftp internal-sftp、Match Group/User 等),随后执行 sudo systemctl restart sshd 使配置生效。
- 验证:使用 sftp 客户端连接测试用户目录与权限是否正确。
六、预防与后续建议
- 为 rm 设置交互别名(如 alias rm=‘rm -i’),删除前二次确认,降低误删概率。
- 建立定期备份策略(如按日/周对 /home 或关键目录做 tar.gz 归档),并妥善异地保存。
- 在 SFTP 环境中规范目录权限与 Chroot 隔离,减少误操作影响范围;变更 sshd_config 后及时重启 sshd 并验证。