2011-03-04 56 views
3

我正在编写脚本来更改NTFS分区(AFAIK,没有)的UUID。这意味着写入/dev/sdaX(X是我的分区的#号)的0x48至0x4F(十进制72-79)中的8个字节。Bash脚本:如何修补文件? (在文件的给定位置写入给定的字符串)

如果我想将其更改为随机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,我可以用于测试和使用

xxd ntfs.bin 

所以这为我提供了一种方法,使用xxd检查结果的任何解决方案检查结果的100个字节的转储文件屏幕,所以我可以比较原始的ntfs.bin文件将不胜感激。

谢谢!

+0

这里只是一个快速的问题,你测试这个'dd'对您的设备成功?你的'echo ... dd'流水线应该可以工作,因为它会读取标准输入'if ='不被命名。 – Xailor 2011-03-04 16:13:21

+0

好吧,我测试了dd if =/dev/urandom对我的ntfs.bin文件。它工作得很好(我编辑我的帖子来添加conv = notrunc选项)。但是我的恐惧是:/ dev/urandom有无限的字节,我的回声只有16个。当使用seek时,它是否同时寻找输出和输入?如何指定“读取整个输入,但仅查找输出”?我应该使用“寻找”还是“跳过”?为什么? – MestreLion 2011-03-04 17:32:31

回答

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 
+0

嗨!第二个命令(wc -c)输出8.那是什么?最后一条命令在** oseek **中有错误,但在将其替换为** seek **后,它似乎在我的测试文件中正常工作。小心解释使用的选项和值?他们是什么,为什么这样的价值?谢谢! – MestreLion 2011-03-06 09:07:24

1

在这里看到:

Replace chars in file by index

# start at char 20, replace the next 11 chars with '#' 
echo '###########' | dd of=FILENAME seek=20 bs=1 count=11 conv=notrunc 
+1

这不会工作。它会写入每个“#”字符的二进制等值。我需要一个十六进制转换,如“echo'FF'” - >单个字节,写入255值。另外,我需要使用从0x41到0x48的位置。 – MestreLion 2011-03-04 17:36:28

相关问题