【问题标题】:Bash Scripting: How to patch files? (write a given string in a given position of a file)Bash 脚本:如何修补文件? (在文件的给定位置写入给定字符串)
【发布时间】:2011-07-08 22:34:57
【问题描述】:

我正在编写一个脚本来更改 NTFS 分区的 UUID(AFAIK,没有)。这意味着将 8 个字节从 0x48 写入 /dev/sdaX 的 0x4F(十进制 72-79)(X 是我的分区的 #)。

如果我想将其更改为随机 UUID,我可以使用这个:

dd if=/dev/urandom of=/dev/sdaX bs=8 count=1 seek=9 conv=notrunc

或者我可以将 /dev/urandom 更改为 /dev/sdaY 以从另一个分区克隆 UUID。

但是...如果我想制作个性化的 UUID 怎么办?我已经以十六进制字符串格式(16 个字符)将它存储(并经过正则表达式检查)在 $UUID 变量中,如下所示:

UUID="2AE2C85D31835048"

我正在考虑这种方法:

echo "$UUID" | xxd -r -p | dd of=/dev/sdaX ...

这只是一个划痕......我不确定使它工作的确切选项。我的问题是:

  • echo $var | xxd -r | dd 真的是最好的方法吗?
  • 使它工作的确切命令和选项是什么?

至于答案,我也在找:

  • 对所使用的所有选项及其作用的说明。
  • 如果可能,在更改分区之前在文件和/或屏幕中测试它的替代命令。

我已经有一个名为 ntfs.bin 的 100 字节转储文件,可用于测试和检查结果

xxd ntfs.bin

因此,任何为我提供在屏幕上使用xxd 检查结果的方法以便我可以与原始 ntfs.bin 文件进行比较的解决方案将不胜感激。

谢谢!

【问题讨论】:

  • 这里只是一个简短的问题,您已经成功地在您的设备上测试了这个dd 吗?您的 echo ... dd 管道应该可以工作,因为如果 if= 未命名,它将读取标准输入。
  • 好吧,我已经针对我的 ntfs.bin 文件测试了 dd if=/dev/urandom。它工作得很好(我编辑了我的帖子以添加 conv=notrunc 选项)。但我担心的是:/dev/urandom 有无限字节,而我的 echo 只有 16 个。使用 seek 时,它是否同时搜索输出和输入?如何指定“读取整个输入,但只寻找输出”?我应该使用“寻找”还是“跳过”?为什么?

标签: bash scripting file patch


【解决方案1】:

试试:

UUID="2AE2C85D31835048"
echo "$UUID" | xxd -r -p | wc -c
echo "$UUID" | xxd -r -p | dd of=file obs=1 oseek=72 conv=block,notrunc cbs=8

【讨论】:

  • 嗨!第二个命令 (wc -c) 输出 8。那是为了什么?最后一个命令在 oseek 中有错误,但在将其替换为 seek 后,它似乎在我的测试文件中工作正常。愿意解释使用的选项和值吗?它们的用途是什么,为什么会有这样的价值观?谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多