【问题标题】:Hex Dump Specific Parts of File - Bash十六进制转储文件的特定部分 - Bash
【发布时间】:2013-12-07 03:28:52
【问题描述】:

我正在尝试编写一个 bash 脚本来审核已擦除的硬盘驱动器,以确保擦除系统正常工作。我想找到一种方法来十六进制转储驱动器的特定部分,而不必十六进制转储整个驱动器并提取我想要的部分(因为这似乎运行时间太长以至于脚本值得编写)。理想情况下,我能够从驱动器的开头、中间和结尾抓取零件。

我想获取十六进制转储的输出并检查它是否只存在一个字符(表示驱动器已成功擦除)。这部分我可以处理,但我认为它可能会影响我可能获得的任何建议。

我已经使用 head piped 到 xxd 来获取文件的开头,该文件有效,但我仍然卡在其他部分。我已经尝试使用 tail 来结束驱动器,但这似乎也不能很快奏效。是否有可能有效地做到这一点?可能使用 dd 或其他东西并将其输入十六进制编辑器?我查看了 xxd 和 hexdump 的选项,但无济于事。如果有人能指出我正确的方向,将不胜感激!

【问题讨论】:

  • 为什么不考虑获取适用于 DOS 的 SeaTools? www.seagate.com

标签: bash hexdump


【解决方案1】:

xxd 具有跳过进入文件的路径 (-s) 并转储有限长度 (-l) 的选项。如果您使用它的普通十六进制 (-p) 选项,您也许可以使用 grep 来查找任何异常:

$ xxd -s 8192 -l 256 -p /dev/disk3s2 | grep [^0]
000000010000000000000000000000000000000000000000000000000000
000000000000000000000000300000000000000800000000000000000000
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb

od 具有类似的跳过 (-j) 和限制长度 (-N)。类似地,ddskip=count=(虽然这些是以块而不是字节为单位计算的;您可以使用 bs= 更改块大小)。

编辑:由于xxd -p 给出了奇怪的结果(不会停在设备的末端),我建议运行一些测试来弄清楚发生了什么。首先,备份计算机上的任何重要内容,因为如果设备访问级别出现异常情况,则其中一些测试可能会覆盖意外的内容,甚至可能覆盖另一个磁盘上的内容。

接下来,尝试使用不同的工具将数据转储到设备的末尾,看看它们的行为方式是否相同:

xxd -s 65451982336 /dev/sdb | more  # This *should* dump 512 bytes (32 lines) then stop, but apparently keeps going
od -xv -j 65451982336 /dev/sdb | more  # This also *should* dump 512 bytes then stop
dd if=/dev/sdb skip=127835903 | xxd | more # This again should do the same thing (note that the skip value is in 512-byte blocks)

其他工具是否读取 fdisk 报告为磁盘末尾的内容?如果所有三个都读取了更多数据,我将使用“fdisk 错误/误导”的答案。您可以通过在“结束”之后写入一些非零数据并查看结果来进一步测试:

dd if=/dev/random of=/dev/sdb seek=127835903 count=2

...然后重复各种转储命令。如果它们显示两个随机数据块(=64 行)后跟零,我很确定该设备比您想象的要大。

【讨论】:

  • 我还是有点迷茫;我想获取驱动器的大小(以字节为单位),从该数字中减去一些量,然后从该点到驱动器的末尾。例如,我目前正在使用连接到我的系统(位于 /dev/sdb)的闪存驱动器,fdisk -l 将其列为 65451982848 字节。如果我运行xxd -s 65451982847 -p /dev/sdb,它似乎会无限期地运行,尽管它距离末尾只有一个字节。有没有办法让它在文件末尾停止,或者我需要像你一样指定一个长度来读取?
  • @user3076673:它在 OS X 上对我来说停在最后,但我没有要测试的 linux 系统......是你从 fdisk 看到的分区大小,或设备尺寸?如果只是分区,xxd可能会跑到设备的末尾。
  • 设备大小。这不是一个大问题,但让我担心的是,这可能表明其他事情无法正常运行。真的,我应该能够从驱动器中的任何位置获取“样本”并检查它们是否只存在一个字符。
  • @user3076673:请参阅我的编辑以了解一些建议的调试策略。
【解决方案2】:

我不在我的外壳附近,但是这些方面的内容应该可以帮助您入门:

dd if=/dev/hda1 | hexdump -C | grep [^00]

将打印所有非零字节。

dd if=/dev/hda1 | od -x -j100

会给你一个带有偏移量的十六进制转储,从 100 字节开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 2016-10-19
    • 2019-05-10
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多