gpt4 book ai didi

linux - 将 dd 的输出读入 shell 脚本变量

转载 作者:太空狗 更新时间:2023-10-29 11:49:21 25 4
gpt4 key购买 nike

作为 shell 脚本的新手,我拼凑了以下内容以逐个扇区搜索 /dev/sdd1 以查找字符串。如何将扇区数据放入 $HAYSTACK 变量?

#!/bin/bash

HAYSTACK=""
START_SEARCH=$1
NEEDLE=$2
START_SECTOR=2048
END_SECTOR=226512895+1
SECTOR_NUMBER=$((START_SEARCH + START_SECTOR))
while [ $SECTOR_NUMBER -lt $END_SECTOR ]; do
$HAYSTACK=`dd if=/dev/sdd1 skip=$SECTOR_NUMBER count=1 bs=512`
if [[ "$HAYSTACK" =~ "$NEEDLE" ]]; then
echo "Match found at sector $SECTOR_NUMBER"
break
fi
let SECTOR_NUMBER=SECTOR_NUMBER+1
done

更新

目的不是制作一个完美的脚本来处理碎片化的文件场景(我怀疑这根本不可能)。

在我的例子中,无法区分字符串和空值也不是问题。

如果您可以将管道建议扩展为答案,那就绰绰有余了。谢谢!

背景

我已设法删除我的 www 文件夹,并一直在尝试恢复尽可能多的源文件。我用过Scalpel恢复我的 php 和 html 文件。但是我可以在我的 Ubuntu 16.04 上使用的版本是 Version 1.60它不支持页眉/页脚中的正则表达式,所以我无法为 css、js 和 json 文件制作一个好的模式。

我记得用于搜索和查找我的文件的字符串很少见,但不知道该字符串在 block 中的位置。我想出的解决方案是这个 shell 脚本,用于从分区中读取 block 并查找子字符串,如果找到匹配项,则打印出 LSB 编号并退出。

最佳答案

  1. 如果搜索的项目是文本字符串,考虑使用-tstrings 命令的选项,用于打印字符串所在位置的偏移量找到字符串。因为 strings 不关心数据在哪里from,它适用于文件、 block 设备和来自 dd 的管道输入。

    以硬盘启动为例:

    sudo strings -t d /dev/sda | head -5

    输出:

        165 ZRr=
    286 `|f
    295 \|f1
    392 GRUB
    398 Geom

    而不是 head 可以通过管道传输到 grep -m 1 GRUB,它将只输出带有“GRUB”的第一行:

    sudo strings -t d /dev/sda | grep -m 1 GRUB

    输出:

        392 GRUB 

    从那里开始,bash 可以做很多事情。此代码查找前 5 个我的引导分区 /dev/sda7 上的“GRUB”实例:

    s=GRUB ; sudo strings -t d /dev/sda7 | grep "$s" | 
    while read a b ; do
    n=${b%%${s}*}
    printf "String %-10.10s found %3i bytes into sector %i\n" \
    "\"${b#${n}}\"" $(( (a % 512) + ${#n} )) $((a/512 + 1))
    done | head -5

    输出(这里的扇区号是相对于分区):

    String "GRUB Boot found   7 bytes into sector 17074
    String "GRUB." found 548 bytes into sector 25702
    String "GRUB." found 317 bytes into sector 25873
    String "GRUBLAYO" found 269 bytes into sector 25972
    String "GRUB" found 392 bytes into sector 26457

    注意事项:

    • 不要使用 strings 进行基于 dd 的单 block 搜索,因为如果字符串跨越两个 block ,它将失败。使用strings获取首先偏移量,然后将该偏移量转换为 block ,(或部门)。

    • strings -t d 可以返回大字符串,“针”可能是字符串中的几个字节,在这种情况下偏移量将是大字符串的开头,而不是 grep 字符串(或“针”)。上面的 bash 代码允许这样做并使用 $n计算修正后的偏移量。

  2. 懒惰的一体式 util rafind2 方法。例如,搜索/dev/sda7 上的第一个“GRUB”实例和以前一样:

    sudo rafind2 -Xs GRUB /dev/sda7 | head -7

    输出:

    0x856207
    - offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
    0x00856207 4752 5542 2042 6f6f 7420 4d65 6e75 006e GRUB Boot Menu.n
    0x00856217 6f20 666f 6e74 206c 6f61 6465 6400 6963 o font loaded.ic
    0x00856227 6f6e 732f 0069 636f 6e64 6972 0025 733a ons/.icondir.%s:
    0x00856237 2564 3a25 6420 6578 7072 6573 7369 6f6e %d:%d expression
    0x00856247 2065 7870 6563 7465 6420 696e 2074 expected in t

    使用一些 bashsed 可以将输出重新加工成相同的格式为 strings 输出:

    s=GRUB ; sudo rafind2 -Xs "$s" /dev/sda7 | 
    sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" |
    sed -r -n 'h;n;n;s/.{52}//;H;n;n;n;n;g;s/\n//p' |
    while read a b ; do
    printf "String %-10.10s\" found %3i bytes into sector %i\n" \
    "\"${b}" $((a%512)) $((a/512 + 1))
    done | head -5

    第一个 sed 实例是从 jfs' answer to "Programthat passes STDIN to STDOUT with color codes stripped?" 借来的,因为rafind2 输出非文本颜色代码。

    输出:

    String "GRUB Boot" found   7 bytes into sector 17074
    String "GRUB....L" found 36 bytes into sector 25703
    String "GRUB...LI" found 317 bytes into sector 25873
    String "GRUBLAYO." found 269 bytes into sector 25972
    String "GRUB .Geo" found 392 bytes into sector 26457

关于linux - 将 dd 的输出读入 shell 脚本变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46974014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com