rm 刪除Linux 透過 /proc/PID/fd/FD 保留對已刪除檔案的引用。inode 連結數雖歸零,但資料區塊未被覆寫,可透過此路徑讀取內容。
# 用戶 A 正在查看
tail -f strace.log
# 用戶 B 誤刪
rm strace.log
# 用戶 C 發現不見
ls strace.log
# ls: cannot access strace.log: No such file or directory
lsof | grep strace.log
# 輸出:
# tail 1234 userA 4r REG 253,0 10240 12 /var/log/strace.log (deleted)
# 關鍵資訊:
# PID = 1234
# FD = 4
ls -l /proc/1234/fd/
# 輸出:
# lr-x------ 1 userA userA 64 Jan 15 10:30 4 -> /var/log/strace.log (deleted)
cp /proc/1234/fd/4 /tmp/strace.log.recovered
# 或
cat /proc/1234/fd/4 > /tmp/strace.log.recovered
# 驗證
diff /tmp/strace.log.recovered <(tail -f 之前的輸出) # 內容一致
#!/bin/bash
# recover_deleted.sh
pattern=$1
lsof | grep "$pattern" | grep deleted | while read line; do
pid=$(echo $line | awk '{print $2}')
fd=$(echo $line | awk '{print $4}' | sed 's/[^0-9]//g')
fname=$(echo $line | awk '{print $9}' | sed 's/ (deleted)//')
cp /proc/$pid/fd/$fd /tmp/recovered_$(basename $fname)_$pid
echo "Recovered $fname from PID $pid FD $fd"
done
extundelete、testdisk、photorec 掃描磁碟恢復