小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

數(shù)據(jù)恢復(fù)(三)

 zjshzq 2024-12-26 發(fā)布于浙江

上周溯源某挖礦case,在排查過程中發(fā)現(xiàn)挖礦文件被人為刪除。最終通過確定文件被刪除的時間以縮小排查ssh登錄的時間范圍從而鎖定了可疑ip。該case引發(fā)了我的思考,linux下如何查找最近被刪除的文件?本文是數(shù)據(jù)恢復(fù)的第三篇文章,只是快速找到被刪除文件,并不涉及如何恢復(fù)文件本身。

大家都知道文件有三個時間戳atime、mtime、ctime。但是在linux下文件還有crtime(創(chuàng)建時間)和dtime(刪除時間)。通過dtime可以查找最近被刪除的文件,但由于inode可能被覆蓋,該方法不一定完全準(zhǔn)確。

如何查看文件的5個時間戳?

數(shù)據(jù)恢復(fù)(三)-linux快速查找最近被刪除的文件

上面的操作中刪除一個文件后,雖然文件的block指針被抹除,但被刪除文件的indoe還在,并且寫入了文件的被刪除時間。

通過使用debugfs命令(linux自帶用于內(nèi)核調(diào)試的虛擬文件系統(tǒng)),獲取文件的5個時間戳。關(guān)于linux文件刪除的原理和debugfs的使用可以參考我之前的文章:數(shù)據(jù)恢復(fù)(一)-linux下ext文件系統(tǒng)數(shù)據(jù)刪除原理淺析 。

如何快速定位哪些目錄中的文件被刪除?

最常見的我們是通過find命令查找linux中文件的變動。因為linux下一切皆文件,目錄本身也是一個文件。比如我們刪除了一個目錄中的文件,該目錄的時間也會發(fā)送改變。

數(shù)據(jù)恢復(fù)(三)-linux快速查找最近被刪除的文件

做一個簡單的測試。原本tmp.873RCQOugw目錄的mtime為2021-12-20,但是我們刪除該目錄中的一個文件之后,該目錄的mtime變?yōu)榱爽F(xiàn)在的時間。

所以可以使用find命令查找存在文件變動的目錄,這樣可以避免全盤掃描,節(jié)省更多的時間。

數(shù)據(jù)恢復(fù)(三)-linux快速查找最近被刪除的文件

有哪些可實現(xiàn)的思路?

我一開始想到了兩種方式。

  1. 直接從磁盤上讀取所有文件的indoe信息,通過比較文件的dtime是否為空判斷該文件是否被刪除。這種方式比較硬核,需要解析inode表的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)相對麻煩,但不會有任何遺漏。
  2. 通過find命令配合debugfs獲取文件dtime,只需編寫shell腳本即可實現(xiàn),相對簡單很多。不過可能會出現(xiàn)部分遺漏(比如文件名中包含空格導(dǎo)致解析失?。?。

為快速驗證我的想法,最終采用了第二種方式實現(xiàn)。

shell腳本實現(xiàn)

linux快速查找最近被刪除的文件,我的腳本代碼如下:

#!/bin/bash tempDir=$(mktemp -d)
# 獲取主分區(qū)
mainPartition=$(df -Th | awk '$NF=='/'{print $1}')
echo '正在掃描3天內(nèi)發(fā)生變動的文件夾'
recentChangedDirs=$(find / -maxdepth 5 \( -path /proc -o -path /run -o -path /sys \) -prune -o -mtime -3 -type d )
for dir in $recentChangedDirs; do
 debugfs -w $mainPartition -R 'ls -d $dir' 2>/dev/null |  xargs -n3 2>/dev/null | awk '/<[0-9]+>/{print $1,$NF}' 2>/dev/null | while read inum fileName
do
 realPath=$dir/$fileName
 inodeInfo=$(debugfs -w $mainPartition -R 'stat $inum' 2>/dev/null )
if echo $inodeInfo | grep -q 'dtime'; then
 crtime=$(echo $inodeInfo| grep -oE 'crtime:.*? [0-9]{4} d')
 dtime=$(echo $inodeInfo| grep -oE 'dtime:.*? [0-9]{4}')
 echo -en '檢測到被刪除的文件:$realPath\n該文件的創(chuàng)建時間為:$crtime\n該文件的刪除時間為:$dtime\n\n' | tee -a $tempDir/deleteFile.log
else
 echo -en '被刪除文件$realPath的inode已被其他文件覆蓋!無法獲取被刪除時間\n' | tee -a $tempDir/deleteFile.log
 fi
 done
done
echo -e '\n\n文件刪除信息已保存至:$tempDir/deleteFile.log'

效果如下:

數(shù)據(jù)恢復(fù)(三)-linux快速查找最近被刪除的文件

腳本放在了我博客上,可以curl測試效果。

curl -sL https:///download/scanDeletedFiles.sh | sh

存在的問題?

inode被其他文件覆蓋后,雖然還能看到被刪除的文件名,但是已經(jīng)看不到被刪除文件的幾個時間戳。(注意:這里說的是inode覆蓋,不是block覆蓋,inode被覆蓋不代表文件的真實內(nèi)容被覆蓋)

已上圖中的 被刪除文件/usr/local/qcloud/YunJing/log/ydservice.20220311.log的inode已被其他文件覆蓋!無法獲取被刪除時間 為例。

數(shù)據(jù)恢復(fù)(三)-linux快速查找最近被刪除的文件

此時雖然還能找到被刪除的文件名,但是從indoe中獲取到的已經(jīng)是新文件的信息了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多