如何在块设备中搜索文本?

如何在块设备中搜索文本?

令我奇怪的是,谷歌没有在顶级结果中返回任何相关(IMO)链接。

我想编辑 iso9660。

这里如何更轻松地使用 Ubuntu 19.10 制作持久实时驱动器?我读了

sed 's/quiet splash/persistent  /' lubuntu-19.10-desktop-amd64.iso > persistent-lubuntu-19.10-desktop-amd64.iso  # yes, sed works with binary files

然后我想,我已经制作了 USB 记忆棒,为什么不尝试编辑它。dd有效,但是sed: couldn't edit /dev/sdb: not a regular file,除了将所有分区转储到文件之外,我最好寻找要替换的文本的位置。

有任何实用程序可以在块文件/设备内进行搜索吗?

答案1

$ sudo grep --only-matching --byte-offset --max-count=1 --text "quiet splash" /dev/sdb
1927125977:quiet splash

因此,这将输出以字节为单位的偏移量,然后除以 512(默认 dd 块大小),然后

sudo dd count=1 skip=3763917 if=/dev/sdb | hd


000001c0  69 6e 69 74 72 64 3d 2f  63 61 73 70 65 72 2f 69  |initrd=/casper/i|
000001d0  6e 69 74 72 64 2e 6c 7a  20 71 75 69 65 74 20 73  |nitrd.lz quiet s|
000001e0  70 6c 61 73 68 20 2d 2d  0a 6d 65 6e 75 20 64 65  |plash --.menu de|
000001f0  66 61 75 6c 74 0a 6c 61  62 65 6c 20 78 66 6f 72  |fault.label xfor|

图案已定位。

答案2

我认为你想完成的是两件不同的事情,

首先是扫描整个分区以查找特定的字符串。

你不应该尝试编辑/读取块设备,而是先尝试安装它们!使用

sudo mkdir /media/iso
sudo mount -o loop path/to/iso/file/YOUR_ISO_FILE.ISO /media/iso 

就你的情况而言。 来源

然后您可以使用提到的 sed 命令。

现在,您真正想要完成的事情(据我所知)是进行持久的实时安装。这可以通过两种方式完成: 将 Ubuntu 安装到 USB 驱动器上 或者 使用持久存储进行 Iso 启动

您可能正在尝试使用持久存储启动 ISO,以便您的更改不会在重启时丢失!

现在这篇文章有点旧了,而且是德语的,不过它对我有用,而且你在网站上使用谷歌翻译后,可能就能理解它的命令片段:)

我的持久实时启动的 Grub 脚本如下,你可以按照所示安装它这里

insmod part_gpt
insmod ext2
set root='(hd0,2)'
set isofile='/iso/ubuntu-21.10-desktop-amd64.iso'

if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,msdos2  4e3de29b-008c-4063-9376-c52f34c87225
else
  search --no-floppy --fs-uuid --set=root 4e3de29b-008c-4063-9376-c52f34c87225
fi

loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile persistent quiet splash noeject
initrd (loop)/casper/initrd

神秘的文本4e3de29b-008c-4063-9376-c52f34c87225是 ISO 所在分区的 UUID。您可以使用 gnome-disks、g-parted 或blkid /dev/sdX 我希望我能帮到您!找到您的分区。

答案3

我扩展了 Martian 的答案,使其自动化。我使用的/dev/mapper/vgmint-rootrootLinux Mint 的 LVM 卷组(带有 Ext4 文件系统)的卷):

sudo grep --only-matching --byte-offset --max-count=1 --text 'unique\.str \
    /dev/mapper/vgmint-root | cut -d: -f1 | xargs -I{} -- sh -xc \
    'sudo dd count=1 skip=$(echo "{} / 512" | bc) if=/dev/mapper/vgmint-root \
        | xxd -c 32'

这实际上是一个有用的恢复删除命令,至少对于小型纯文本文件来说如此。--max-count=1如果您希望看到更多匹配项,并且count=1预计文件长度超过 512 字节,则可以增加该值。

如果您找到了所需内容,请将输出复制xxd到文件中并运行,瞧!

xxd -c 32 -r the_xxd_output_to_reverse

相关内容