2010-04-06 16 views

Odpowiedz

18

Użyj polecenia dd do odczytu danych z/dev/random.

dd if=/dev/random of=random.dat bs=1000000 count=5000 

Oznacza to 5000 bloków o wielkości 1 MB losowych danych, czyli 5 gigabajtów losowych danych!

Eksperymentuj z argumentem bloku, aby uzyskać optymalną wydajność.

+0

dd -bs = 1024 count = 1 jeśli/dev/random z = test nie generuje prawidłowego rozmiaru pliku Chcę ... –

+0

@Tadeusz: Zazwyczaj należy używać bs = 1M, jeśli chce MiB, a nie MB. – wRAR

+0

@CKeven: 'bs', nie' -bs'. – wRAR

0

zmiennej losowej daje inny numer za każdym razem:

echo $RANDOM 
7
head -c 10 /dev/random > rand.txt 

zmianę 10 do czegokolwiek. Przeczytaj "man random" dla różnic między/dev/random i/dev/urandom.

Albo na tylko znaki Base64

head -c 10 /dev/random | base64 | head -c 10 > rand.txt 

W base64 może zawierać pewne znaki, które nie są zainteresowane, ale nie miał czasu, aby wymyślić lepszy konwerter postaci pojedynczej wkładki ... (również bierzemy zbyt wiele bajtów z/dev/random Niestety, entropii basenie.!)

+0

oops, brakowało znaków i cyfr, domyślam się, że masz na myśli znaki alfanumeryczne ... musisz je poprawić. –

+1

Zapisywanie entropii: najnowszy trend ekologicznego życia egologów. :) –

3

dobrym początkiem byłoby:

http://linuxgazette.net/153/pfeiffer.html

#!/bin/bash 
# Created by Ben Okopnik on Wed Jul 16 18:04:33 EDT 2008 

######## User settings  ############ 
MAXDIRS=5 
MAXDEPTH=2 
MAXFILES=10 
MAXSIZE=1000 
######## End of user settings ############ 

# How deep in the file system are we now? 
TOP=`pwd|tr -cd '/'|wc -c` 

populate() { 
    cd $1 
    curdir=$PWD 

    files=$(($RANDOM*$MAXFILES/32767)) 
    for n in `seq $files` 
    do 
     f=`mktemp XXXXXX` 
     size=$(($RANDOM*$MAXSIZE/32767)) 
     head -c $size /dev/urandom > $f 
    done 

    depth=`pwd|tr -cd '/'|wc -c` 
    if [ $(($depth-$TOP)) -ge $MAXDEPTH ] 
    then 
     return 
    fi 

    unset dirlist 
    dirs=$(($RANDOM*$MAXDIRS/32767)) 
    for n in `seq $dirs` 
    do 
     d=`mktemp -d XXXXXX` 
     dirlist="$dirlist${dirlist:+ }$PWD/$d" 
    done 

    for dir in $dirlist 
    do 
     populate "$dir" 
    done 
} 

populate $PWD 
0

Zapisz jako "script.sh", uruchom jako ./script.sh SIZE. Kod printf został usunięty z http://mywiki.wooledge.org/BashFAQ/071. Oczywiście, możesz zainicjować tablicę mycharów za pomocą brutalnej siły, mychars = ("0" "1" ... "A" ... "Z" "a" ... "z"), ale to by nie być zabawą, prawda?

#!/bin/bash 
declare -a mychars 
for ((I=0; I<62; I++)); do 
    if [ $I -lt 10 ]; then 
     mychars[I]=$I 
    elif [ $I -lt 36 ]; then 
     D=$((I+55)) 
     mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8))) 
    else 
     D=$((I+61)) 
     mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8))) 
    fi 
done 
for ((I=$1; I>0; I--)); do 
    echo -n ${mychars[$((RANDOM%62))]} 
done 
echo 
+0

Podejście/dev/random i base64 jest również dobre, zamiast przepuszczania przez base64, przepuszczanie przez "tr -d -c [: alnum:]", wystarczy policzyć dobre znaki, które pojawią się do momentu gotowe. – nortally

1

Tworzenie 100 losowo nazwach plików w rozmiarze 50MB każda:

for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done 

+0

Lepiej używać mktemp do tworzenia losowych plików. dla i w seq 1 100; do myfile = 'mktemp --tmpdir = .' dd jeśli =/dev/urandom bs = 1024 count = 50000> $ myfile zrobione –