Computer >> 컴퓨터 >  >> 문제 해결 >> Linux

Bash에서 난수 생성하기: 상황별 방법 총정리

bash 프롬프트에서는 단 한 줄의 명령어로 난수를 손쉽게 생성할 수 있으며, 생성된 숫자를 변수에 담아 자유롭게 활용할 수도 있습니다. 이 기능은 특정 종류의 스크립트를 작성할 때부터 테이블탑 롤플레잉 게임에서 주사위를 굴리는 용도까지 폭넓게 사용됩니다. D&D 캠페인을 진행하든, 강력한 bash 언어로 유틸리티를 만들든 대부분 한 줄의 코드면 충분합니다.

또한 간단한 보안 점검 작업에도 유용하게 쓰일 수 있지만, 숙련된 크래커라면 이런 단순한 난수 생성기는 우회할 수 있다는 점은 기억해야 합니다. 그럼에도 불구하고 특정 형태의 비밀번호나 코드를 생성하는 데에는 여전히 실용적인 도구입니다.

난수를 만드는 방법은 여러 가지가 있으며, 모든 기술이 모든 상황에 맞는 것은 아닙니다. 그래서 이번 글에서는 각 방법을 하나씩 살펴보고 실제로 테스트까지 마친 내용을 정리했습니다. 먼저 터미널을 열어야 하는데, Ctrl+Alt+T 또는 Super(Windows)+T로 그래픽 터미널을 실행하거나, Dash에 'terminal'을 입력해 실행하거나, 응용 프로그램·Whisker·시스템 도구 메뉴에서 선택하거나, Ctrl+Alt+F1~F6 키 조합으로 가상 터미널에 직접 접속하면 됩니다.

방법 1: 완전한 랜덤 바이트 하나 선택하기

1부터 256 사이의 난수를 생성하려면 bash 프롬프트에서 아래 명령어를 바로 실행하면 됩니다.

od -An -N1 -tu1 /dev/urandom

간혹 이 명령어에서 /dev/urandom 대신 /dev/random을 참조하라고 안내하는 경우도 있지만, 그렇게 실행하지 않는 것이 좋습니다. /dev/random을 사용하면 다른 프로그램이 난수 시드 생성기를 사용하지 못하게 막아버리는 부작용이 생길 수 있습니다. 명령어를 실행해 숫자를 얻었다면, 아래와 같은 방식으로 변수에 담는 것도 잘 동작합니다.

ranNum=$(($(od -An -N1 -tu1 /dev/urandom)))

이 코드는 ranNum 변수에 실행 시점에 무작위로 선택된 1~256 사이의 숫자를 할당합니다. 명령줄에서 직접 실행해도 되고, 스크립트 내부에서 호출해도 정상적으로 동작합니다. ranNum은 원하는 유효한 변수 이름으로 얼마든지 바꿀 수 있습니다.

방법 2: 1부터 원하는 값 사이의 난수로 변수 설정하기

명령줄에서 echo $[RANDOM%40+1]을 실행하면 1부터 40 사이의 난수가 표준 출력으로 바로 전달됩니다. 물론 명령어 안의 40은 거의 어떤 숫자로도 교체할 수 있습니다. 호스트 머신의 아키텍처나 bash 자체가 표현할 수 있는 자릿수에는 결국 한계가 있지만, 그 정도로 큰 숫자가 필요할 일은 사실상 없습니다.

예를 들어 변수 설정을 위해 1부터 10 사이의 난수를 만들고 싶다면 다음과 같이 실행합니다.

ranNum=$[RANDOM%10+1]

여기서 10은 원하는 최댓값으로 자유롭게 변경할 수 있습니다. 이 값은 포함 범위(inclusive)이므로 10도 결과로 반환될 수 있습니다. 범위를 하나 줄이고 싶다면 C나 C++ 스타일의 -1 연산 대신 그냥 값을 9로 지정하면 됩니다. 이 방식으로 변수를 설정할 때 별도의 연산을 추가하면 오히려 예상치 못한 숫자가 더해지거나 빠져나가 결과가 어긋날 수 있습니다.

방법 3: 0 또는 1의 랜덤 비트 하나 선택하기

변수를 0 또는 1 중 하나로 설정해야 한다면 앞선 코드를 다음과 같이 수정하면 됩니다.

ranNum=$(($(od -An -N1 -i /dev/urandom) % 2))

이 코드는 /dev/urandom 파일에서 샘플링한 값이 짝수인지 홀수인지에 따라 ranNum을 0 또는 1로 설정합니다. 단순한 예/아니오 판정을 두 상태 중 하나에 매핑해야 할 때 유용합니다.

만약 이 정도의 무작위성으로는 부족하다면, /proc/sys/kernel/random 디렉터리를 호출해 조금 더 무작위성이 강화된 값을 얻을 수 있습니다.

ranNum=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))

다만 이 방법 역시 변수에 0 또는 1만 할당하므로 이진 논리에는 완벽하지만, 더 긴 숫자가 필요한 경우에는 적합하지 않습니다. 물론 필요하다면 위의 어떤 명령줄이든 bash 스크립트 안에서 사용할 수 있습니다. 첫 번째 방법이 제대로 동작하지 않는 상황에서는 두 번째 방법이 더 나은 대안이 될 수 있습니다.

방법 4: 난수를 반환하는 bash 스크립트 만들기

언제든 편리하게 난수를 뽑아 쓰고 싶다면, 명령줄 스크립트를 직접 만들어 두는 것이 좋습니다. 이 스크립트는 대부분의 최신 Linux 배포판이 기본 탑재하고 있는 표준 bash 문법만 사용하므로, 현대적인 리눅스 배포판은 물론 BSD 계열 운영체제 상당수에서도 문제없이 동작합니다. 스크립트를 어디서든 실행할 수 있도록 cd ~/.local/bin 명령으로 해당 디렉터리에 먼저 이동해 두는 것을 권장합니다.

nano random 또는 vi random을 입력해 편집기를 시작하세요. 물론 스크립트 이름이나 텍스트 편집기는 취향에 따라 달리 선택해도 됩니다. 명령줄에서 실행했을 때 1 또는 0을 반환하는 스크립트를 만들어 보겠습니다. nano를 사용한다면 아래 내용을 입력한 뒤 Ctrl+O로 저장합니다.

#!/bin/bash
ranNum=$(($RANDOM % 2))
echo $ranNum

Ctrl+X로 편집기를 종료한 뒤, 명령줄로 돌아와 chmod +x random을 입력해 스크립트에 실행 권한을 부여합니다. ranNum=$(($RANDOM % 2)) 자리에는 ranNum=$[RANDOM%10+1], ranNum=$(($(od -An -N1 -tu1 /dev/urandom))) 등 앞서 소개한 어떤 명령어든 넣을 수 있으므로, 원하는 형태의 숫자를 정확히 통제할 수 있습니다. 예를 들어 1부터 50 사이의 숫자를 자주 뽑고 싶다면 스크립트 내용을 다음과 같이 바꾸면 됩니다.

#!/bin/bash
ranNum=$[RANDOM%50+1]
echo $ranNum

이제 명령줄에서 random이라고 입력할 때마다 손쉽게 난수를 생성할 수 있습니다.

마치며

Bash에서 난수를 생성하는 방법은 목적에 따라 골라 쓰는 것이 중요합니다. 넓은 범위가 필요하면 /dev/urandom 기반 명령어를, 일반적인 용도라면 RANDOM 변수를, 이진 선택이 필요하면 나머지 연산을 활용하면 됩니다. 반복적으로 사용한다면 스크립트로 만들어두는 것이 가장 효율적입니다.


저자 소개

Bash에서 난수 생성하기: 상황별 방법 총정리

Kevin Arrows

Kevin Arrows는 10년 이상의 업계 경력을 지닌 베테랑 기술 전문가입니다. Microsoft Certified Technology Specialist(MCTS) 자격증을 보유하고 있으며, 최신 기술 동향을 끊임없이 학습하는 데 깊은 열정을 가지고 있습니다. 소프트웨어 개발, 사이버 보안, 클라우드 컴퓨팅 등 다양한 기술 분야에서 방대한 양의 글을 집필해 왔으며, 그의 전문성과 지식은 동료들에게 폭넓게 인정받고 있습니다. 특히 복잡한 기술 개념을 명확하고 간결하게 설명하는 능력으로 높은 평가를 받고 있습니다.