Bashを使用してバイトを変更しようとしています。
したがって、オフセットの前のバイト、変更したいバイト、ファイルの残りの部分を記録します。
しかし、次のスクリプトは期待どおりに機能しません。
誰でも見ていただけますか?どの部分が間違っているのかわからない
#!/bin/bash
file=/etc/passwd
out=passwd.mod
offset=0x5
dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset - 1))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 skip=$(($offset + 1))
ベストアンサー1
私が正しく理解したら、これがあなたに役立つと信じています。
#!/bin/bash
file=passwd.orig
out=passwd.mod
offset=0x5
dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 seek=$((offset+1)) skip=$(($offset + 1))
seek
「書き込みヘッダー」を正しい位置に配置し、skip
そのバイトが出力に(再び)書き込まれるのを防ぐ必要があります。
より良いもの
1バイトのみを変更(代替)すると、単純な(およびPOSIX)コマンドと同様に、ファイルのコピーから直接実行できます。
#!/bin/sh
file=passwd.orig out=passwd.mod offset=0x05
cp "$file" "$out"
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
バイトを「挿入」するには、上記のコマンドが必要ですが、オフセットが一部変更されます。これが必要かどうか尋ねてください。