리눅스 랜덤 문자열을 생성해 봅시다.

OS/리눅스 2022. 11. 28. 03:27

 랜덤한 문자열을 뽑고 싶습니다. 어떻게 하면 좋을까요? python에서는 random.choices와 비슷하게 뽑고 싶다는 이야기입니다. 즉, 같은 문자가 여러 번 나와도 됩니다.

 


 이 때 쓸 수 있는 것이 /dev/random, /dev/urandom을 이용하는 방법입니다.

 

 그러면, 이런 이상한 문자들이 끝도 없이 생성됨을 알 수 있어요. 이들을 적절히 정제한 다음에 상위 x개만 자른다면 비슷한 기능을 구현할 수 있겠네요.

 

 여담으로, /dev/urandom의 file type을 보면 character special이라고 되어 있네요.

 


 문자열 중에서 특정 문자만을 삭제하는 경우 tr 명령어를 잘 쓰게 되는데요. -c 옵션을 붙이면 complement를 의미합니다. 반전의 의미입니다. 예를 들어, ^%123asadf^&*&"에서 숫자와 대소문자만 나오게 하고 싶어요.

 

 

 이 경우, tr -dc "a-zA-Z0-9"를 입력해 주면 됩니다. 문자 집합을 삭제할 것인데요. -c 옵션이 붙었기 때문에, "a-zA-Z0-9"가 아닌 것을 삭제할 문자 집합으로 삼게 됩니다. 대소문자, digit가 아닌 것은 ^, %, ^, &, *, . 이므로 이들을 제거한 결과인 123asadf를 출력하게 됩니다.

 

 적용 후에 출력되는 것을 보면, F9LNoY... 가 출력됩니다. 상당히 긴 문자열이 끝없이 출력됨을 볼 수 있어요. 우리가 원하는 것은 앞에 n byte입니다. 예를 들어, 알파벳 대소문자나 숫자로만 이루어진 랜덤한 15자의 문자가 있을 겁니다.

 


 이 때, head -c 옵션을 쓰면 유용합니다. -c는 첫 n byte를 출력합니다. 예를 들어, head -c 15는 첫 15바이트를 출력해 줍니다.

 

 

 그래서, cat /dev/urandom | tr -dc "a-zA-Z0-9" | head -c 15를 입력하면, 대소문자와 숫자로만 이루어진 랜덤한 문자열 15자를 출력하게 됩니다. Pgu3zy9Mnk1TktF의 길이와 zHvV4f9HbUuBV9m의 길이는 15입니다.

 

 

 당연한 이야기겠지만, 이 방법대로 하면, 같은 문자가 반복해서 나올 수도 있습니다. 위 그림은 이를 보여줍니다. 정리하면, 캐릭터 장치 파일인 /dev/urandomtr -dc, 그리고 head -c 명령어를 이용해서 랜덤한 문자열을 만들 수 있다. 정도를 보시면 될 듯 합니다.