bash脚本: Mass Restore Files with Sleuthkit

标签 bash computer-forensics

found a bash script online使用 Sleuthkit 批量恢复文件,但由于我认为脚本本身存在错误,所以在使用它时遇到了麻烦。这是脚本:

IMAGE=$1
LIST=$2
DEST=$3

cat $LIST | while read line; do
   filetype=`echo "$line" | awk {'print $1'}`
   filenode=`echo "$line" | awk {'print $2'}`
   filenode=${filenode%:}
   filename=`echo "$line" | cut -f 2 -d '   '`

   if [ $filetype == "r/r" ]; then
      echo "$filename"
      mkdir -p "`dirname "$DEST/$filename"`"
      icat -f ext2 -r -s $IMAGE "$filenode" > "$DEST/$filename"
   fi
done

一切正常,直到 cut语句,抛出此错误:

cut: the delimiter must be a single character

显然,脚本试图使用字符串作为分隔符,而 cut 命令不允许。但是,这不是必需的,因为输出实际上是制表符分隔的。但是,删除分隔符会产生以下错误消息:

[: 16: r/r: unexpected operator

对于每一行。输入(LIST 文件)如下所示:

r/r 8457-128-3: Architects list.docx
r/r 90219-128-4:    ACID Pro 7.0 Projects/Track 2 - 3.sfk
r/r 90208-128-4:    ACID Pro 7.0 Projects/Track 2 - 3.wav
r/r 192969-128-3:   OLD SCHOOL PAPERS/Doc Comp.docx

awk {'print $1'}的输出是这两行之一或另一行:

r/r
d/d

awk {'print $2'}的输出是文件 inode,如下所示:

134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:

我怀疑冒号 (:) 是问题所在,因此我通过将文件节点管道连接到 sed 来删除它。声明去掉了冒号,但这也没有解决问题。因此,修改此行以修复第一个问题后:

   filename=`echo "$line" | cut -f 2 -d '   '`

致:

   filename=`echo "$line" | cut -f 2`

即使从文件 inode 号中删除冒号后,我仍然遇到此错误:

[: 16: r/r: unexpected operator

该脚本是为 ext2 文件系统编写的,但我在 NTFS 文件系统上使用它。我已经修改了必要的行,并且可以获得 icat命令按照编写的方式工作,因此不更改相关部分不是问题(各行工作正常,我已经对此进行了调试,并且知道如何进行)。

这是我当前的脚本:

IMAGE=/dev/sdb
LIST=files.lst
DEST=~/Desktop/sol/backup

cat $LIST | while read line; do
   filetype=`echo "$line" | awk {'print $1'}`
   filenode=`echo "$line" | awk {'print $2'}`
   filenode=${filenode%:}
   filename=`echo "$line" | cut -f 2`

   if [ $filetype == "r/r" ]; then
      echo "$filename"
      mkdir -p "`dirname "$DEST/$filename"`"
      icat -f ntfs -o 409600 -r -s $IMAGE "$filenode" > "$DEST/$filename"
   fi
done

这就是我迄今为止所做的所有故障排除和思考。有什么想法吗?

更新

我被要求显示 cat -vte $LIST 的输出,如下(示例):

r/r 284268-128-4:^IVirtualDJ/Skins/VirtualDJ 7 (6 Decks).zip$
r/r 284265-128-4:^IVirtualDJ/Skins/VirtualDJ5.zip$
d/d 284231-144-6:^IVirtualDJ/Tracklisting$
r/r 284345-128-4:^IVirtualDJ/Tracklisting/2013-06-21.m3u$
d/d 15695-144-1:^IMy Music$
r/r 14970-128-3:^IDemotivational pics.docx$
r/r 1677-128-1:^Idesktop.ini$
r/r 881-128-4:^IDocument 1.doc$

最佳答案

像这样读取制表符分隔文件:

while  IFS=$' \t:' read filetype filenode filename; do
    if [ "$filetype" = "r/r" ]; then
       echo "$filename"
       mkdir -p "`dirname "$DEST/$filename"`"
       icat -f ntfs -o 409600 -r -s $IMAGE "$filenode" > "$DEST/$filename"
    fi
done < $LIST

关于bash脚本: Mass Restore Files with Sleuthkit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170613/

相关文章:

Bash 随机化变量

java - ssh连接关闭后通过java在后台执行bash脚本

php - 主机检测到恶意 PHP 文件

使用 Linux 恢复 Windows 跨磁盘 (LDM)?

linux - slurm SBATCH - 多个节点,相同的 SLURMD_NODENAME

bash - 基本 bash 脚本返回 "invalid syntax"

xml - XLSX 对变更的取证分析

git - 确定 git 提交来自哪台计算机

opera - Opera Turbo 如何压缩数据(缓存)?

linux - Bash 命令未在 Apache CGI Shell 中运行