/dev/urandom의 내용을 변수에 넣으시겠습니까?

/dev/urandom의 내용을 변수에 넣으시겠습니까?

이것은 이전 주제에 대한 후속 조치입니다. 날짜 명령을 변수에 전달하시겠습니까?

글쎄요, 저는 /dev/urandom이 4자리 숫자를 생성하길 원합니다. 그리고 변수에 넣어보세요.

다음은 내 bash 스크립트의 예입니다.

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

내가 결과를 "에코"하려는 유일한 이유는 /dev/urandom이 나에게 4자리 숫자를 올바르게 생성했는지 실제로 볼 수 있기 때문입니다.

내가 만들고 싶은 bash 스크립트의 경우 생성된 결과를 추가로 조작하고 싶기 때문에 프로그래밍 방식으로 이 작업을 수행해야 합니다.

따라서 결과를 "반향"할 필요가 없습니다. 이것도 이렇다a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

실제로 변수 "a"에 4개의 난수를 넣는다고요? 스크립트에서 "a"를 에코하면 콘솔이 정지되고 콘솔을 복원하려면 "CTRL+C"를 사용해야 합니다.

내가 하고 싶은 것은 /dev/urandom에 있는 4개의 난수를 변수에 넣는 것입니다.

저는 bash 스크립팅이 처음이므로 모든 제안을 환영하며 도움이나 제안에 대해 미리 감사드립니다.

답변1

보안이 필요하지 않으면 bash의 내장 기능을 사용할 수 있습니다RANDOM바꾸다. 0에서 9999(포함) 사이의 난수를 얻으려면 값이 [0, 32767] 범위에서 균일하기 $((RANDOM % 10000))때문에 767보다 작은 값에 대해 약간의 편차가 발생합니다 . $RANDOM균일한 분포를 얻고 앞에 0을 배치하려면 다음을 수행하십시오.

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

다시 한번 말씀드리지만 이는 보안이 관련된 곳에서는 적용되지 않습니다. 출력을 $RANDOM예측할 수 없습니다.

정말로 보안이 필요한 경우 이곳이 /dev/urandom임의의 데이터를 얻을 수 있는 최적의 장소입니다. 대부분의 최신 unice에서는 호출이 fold필요하지 않습니다. ​​를 사용하여 4자를 얻을 수 있습니다 head -c.

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cPOSIX가 아니며 OpenBSD에는 존재하지 않지만 다른 BSD 및 Linux(둘 다 GNU coreutils 및 BusyBox 사용)에는 존재합니다.

head -cPOSIX 표준 이 없는 시스템으로 포팅해야 한다면 fold -w 4 | head -n 1POSIX 표준이 좋은 대안입니다. 호출해야 합니다. head그렇지 않으면 fold4자리 출력 라인이 영원히 유지됩니다.

답변2

fold숫자의 무한한 흐름만 접혀지고 따라서 a무한정 정의됩니다. 가장 쉬운 방법으로 kill 명령을 추가해야 합니다 head.

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

이 두 명령의 동작을 비교해 보세요.

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

첫 번째는 4자리 난수로 이루어진 무한 스트림을 표시하고, 두 번째는 한 줄 후에 종료됩니다.

관련 정보