Bash脚本:使用Sleuthkit批量还原文件

Bash脚本:使用Sleuthkit批量还原文件,bash,computer-forensics,Bash,Computer Forensics,我支持使用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 "$

我支持使用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
[: 16: r/r: unexpected operator
显然,脚本试图将字符串用作cut命令不允许的分隔符。但是,这不是必需的,因为输出实际上是以制表符分隔的。但是,删除分隔符会产生以下错误消息:

[: 16: r/r: unexpected operator
每行。输入(列表文件)如下所示:

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
134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:
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
awk{'print$1'}
的输出是这两行中的一行或另一行:

r/r
d/d
awk{'print$2'}
的输出是文件索引节点,如下所示:

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
134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:
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
我怀疑冒号(:)是问题所在,所以我通过将filenode管道化到一个
sed
语句中删除了冒号,但这也没有解决问题。因此,在修改此行以修复第一个问题后:

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

即使从文件inode编号中删除冒号,我仍然会遇到以下错误:

cut: the delimiter must be a single character
[: 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 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
134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:
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
而IFS=$”\t:“读取文件类型filenode filename;做
如果[“$filetype”=“r/r”];然后
回显“$filename”
mkdir-p“`dirname”$DEST/$filename”`”
icat-f ntfs-o 409600-r-s$IMAGE“$filenode”>“$DEST/$filename”
fi
完成<$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
134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:
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
而IFS=$”\t:“读取文件类型filenode filename;做
如果[“$filetype”=“r/r”];然后
回显“$filename”
mkdir-p“`dirname”$DEST/$filename”`”
icat-f ntfs-o 409600-r-s$IMAGE“$filenode”>“$DEST/$filename”
fi
完成<$LIST

顺便说一句,你的问题已经有了很好的记录,我把它升级为冒号可能是问题吗?让我们悬赏吧。再次感谢!顺便说一句,你的问题已经被很好地记录下来了,我把它投了更高的票。科隆可能是问题所在吗?让我们悬赏吧。再次感谢!