2011-03-04 54 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

相關問題