linuxbashshdd

How to Write Block of Random Data to File using Bash


I need to write a 5MB block of data obtained from /dev/urandom to a partition, at a specific location in the partition. I then need to check that the write executed correctly. I was previously successfully doing this in C++, but now I would like to implement it in a bash script.

My C++ code consisted of:

Im not experienced with writing bash scripts but this is what I've got so far, although it doesn't seem to work:

random_data="$(cat /dev/urandom | head -c<5MB>)"

printf $random_data | dd of=<partition_path> bs=1 seek=<position_in_partition> count=<5MB>

file_data=$(dd if=<partition_path> bs=1 skip=<position_in_partition> count=<5MB>)

if [ "$random_data" == "$file_data" ]
then
 echo "data write successful"
fi

Thanks to the helpful commenters my script now looks something like this:

# get 10MB random data 
head -c<10MB> /dev/urandom > random.bin
# write 10MB random data to partition
dd if=random.bin of=<partition_location>
# copy the written data
dd if=<partition_location> count=<10MB/512 bytes> of=newdata.bin
# compare 
cmp random.bin newdata.bin

At this point cmp returns that the first char is different. Looking at a verbose output of cmp and turns out all values in newdata.bin are 0.


Solution

  • Here's a simpler approach which just saves the data in a temporary file.

    #!/bin/sh
    
    set -e
    
    random_data=$(mktemp -t ideone.XXXXXXXX) || exit
    trap 'rm -rf "$t"' EXIT
    
    dd if=/dev/urandom bs=10240 count=512 of="$random_data"
    
    dd if="$random_data" of=<partition_path> bs=1 seek=<position_in_partition> count=<5MB>
    
    if dd if=<partition_path> bs=1 skip=<position_in_partition> count=<5MB> |
        cmp "$random_data"
    then
     echo "data write successful"
    fi