Solaris에서 난수를 생성하는 가장 좋은 방법은 무엇입니까?
이에 대한 좋은 답을 찾을 수 없는 것 같습니다. 대부분의 결과가 내 환경에서는 작동하지 않습니다. $RANDOM과 비슷한 방식으로 작동하는 변수나 명령 RAND를 갖는 것이 논리적인 것 같습니다. 대부분의 검색에서 본 적이 있지만 항상 0이 생성됩니다.
이 명령을 찾았습니다
od -X -A n /dev/random | head -2
이것은 무작위로 보이지만 반환 형식은 (나에게) 이상합니다.
140774 147722 131645 061031 125411 053337 011722 165106
066120 073123 040613 143651 040740 056675 061051 015211
현재 사용되는 것:
-bash-3.2$ uname -a
SunOS XXXXXXXXX 5.10 Generic_150400-29 sun4v sparc SUNW,SPARC-Enterprise-T5120
답변1
$RANDOM
ksh 및 bash에서 사용 가능하지만 /bin/sh
. 값은 0에서 32768 사이의 임의의 숫자이므로 암호화에 적합하지 않습니다.
읽기는 /dev/random
암호화 사용에 적합한 임의 바이트 스트림을 생성합니다. 이는 널 바이트를 포함할 수 있는 임의 바이트이므로 쉘 변수에 저장할 수 없습니다. $n
파일에 바이트를 저장할 수 있습니다
</dev/random dd ibs=1 count=$n >rnd
od
8진수 또는 16진수 값을 사용하여 이러한 바이트를 인쇄 가능한 표현으로 변환 할 수 있습니다 . 출력이 "이상하다"면 다른 od
옵션을 선택해야 할 수도 있습니다.
인쇄 가능한 표현을 얻는 또 다른 옵션은 uuencode
Generate Base64를 호출하는 것입니다.
</dev/random dd ibs=1 count=$n | uuencode -m _ | sed -e '1d' -e '$d'
답변2
다음은 바이트(16진수로 표시 n
)를 가져오는 세 가지 방법입니다.2*n
#!/bin/bash
n=64
# Read n bytes from urandom (in hex).
xxd -l "$n" -p /dev/urandom | tr -d " \n" ; echo
od -vN "$n" -An -tx1 /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"' /dev/urandom ; echo
urandom에서 읽습니다(반드시 urandom을 사용하십시오).
16진수는 파일로 리디렉션되거나 변수에 저장될 수 있습니다.
a="$(xxd -l "$n" -p /dev/urandom)"
xxd를 사용하여 다음과 같이 원시 바이트를 얻을 수 있습니다.
## 경고, 이는 바이너리 값을 생성합니다
echo "$a" | xxd -r -p # If the Hex digits are in a variable.
xxd -r -p "$rndfile" # If the Hex digits are in a file.
xxd를 사용할 수 없고 16진수가 있다고 가정하면 $a
다음
bash 코드를 사용할 수 있습니다.
#!/bin/bash
>"$rndfile" # erase the file
for (( i=0; i<${#a}/2; i++ )); do # do a loop over all byte values.
# convert 2 hex digits to the byte unsigned value:
printf '%b' $(printf '\\0%o' "0x${a:$i*2:2}") >> "$rndfile"
b="${b#??}" # chop out two hexadecimal digits.
done
또는 이 sh 호환 코드를 사용해 볼 수도 있습니다(bash에서 쉽게 실행되어야 함). 예, sh와 호환되어야 합니다. 문제를 발견하면 신고해주세요.
대시에서만 테스트되었습니다(그러나 다른 일부에서는 작동해야 함).
#!/bin/sh
i=$((${#a}/2)) # The (length of $a ) / 2 is the number of bytes.
b="$a" # use a temporal variable. It will be erased.
: >"$rndfile" # erase file contents
while [ $i != 0 ]; do
# Write one byte transformed to binary:
printf '%b' $(printf '\\0%o' "0x${b%"${b#??}"}") >> "$rndfile"
b="${b#??}" # chop out two hexadecimal digits.
i=$((i-1)) # One byte less to finish.
done
답변3
</dev/random \
dd bs="${num_len}" count=1 | LC_ALL=C \
tr -c 0-9 "$(printf '[%d*24]' 9 8 7 6 5 4 3 2 1)[0*]"
숫자 분포는 0에 매우 적합하지만 10진법에서는 잘 작동하고 아무 것도 낭비되지 않습니다.
$(...)
Solaris v<11의 경우 명령 대체 대신 ` 백틱을 사용해야 합니다 .