XKCD와 유사한 비밀번호 목록에서 임의의 단어 4개를 생성합니다.

XKCD와 유사한 비밀번호 목록에서 임의의 단어 4개를 생성합니다.

먼저, txt 파일에서 임의의 줄을 출력하는 방법을 알고 있습니다.

perl -MList::Util -e 'print List::Util::shuffle <>' words.txt

하지만 txt 파일에서 임의의 4개 단어를 출력하려면 일반적인 솔루션(perl은 일반적으로 모든 유닉스 계열 운영 체제에 설치됨)이 필요합니다. 어떻게 할 수 있습니까?

$ cat words.txt
...
alpha
beta
gamma
delta
epsilon
...
$

"..."는 다른 많은 단어를 의미합니다.

출력 예(그들 사이에 줄 바꿈이 없지만 끝에 유닉스 줄 바꿈이 필요하며 공백으로 구분해야 함):

$ perl SOMEMAGIC words.txt
gamma alpha delta beta
$

Perl만 사용하는 것이 가장 짧은 솔루션입니다(oneliner).

이는 인간에게 기억에 남는 비밀번호 생성기 역할을 합니다.https://xkcd.com/936/

afaik perl은 "임의 생성기"라고 불릴 만큼 훌륭하기 때문입니다.

32768개의 고유 행이 있는 일반적인 영어 단어 테이블의 예:https://pastebin.ubuntu.com/23726760/

답변1

Perl은 실제로 난수를 안전하게 생성하기 위해 타사 라이브러리가 필요하기 때문에 그다지 좋은 도구는 아닙니다. 기본 난수 생성기(rand또는 동일한 소스의 다른 콘텐츠(예: List::Util::shuffle보안 관련 목적에 적합하지 않은 콘텐츠)를 사용합니다. Perl을 사용하고 싶다면 설치해주세요수학::무작위::안전(및 해당 종속성) ( perl -MCPAN -eshell및 실행 install Math::Random::Secure).

perl -MMath::Random::Secure=rand -l -e '@words = <>; print map $words[rand(@words)], 1..4' words.txt

대신 Python을 사용하는 것이 좋습니다. 오늘날 이는 Perl만큼 일반적이며 표준 라이브러리는 더욱 포괄적입니다. 예, 코드는 더 길지만 단축 코드 자체가 품질을 나타내는 것은 아닙니다.

python -c 'import random, sys; rng = random.SystemRandom(); words = sys.stdin.readlines(); print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])' <words.txt

더 읽기 쉬운 여러 줄 형식으로:

import random, sys
rng = random.SystemRandom()
words = sys.stdin.readlines()
print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])

또는 골동품이 아닌 GNU coreutils(내장형이 아닌 Linux 및 Cygwin의 경우)가 있는 경우 다음을 사용할 수 있습니다.shuf유용. options 을 통해 안전한 무작위 생성기를 전달해야 합니다 --random-source.

shuf --random-source=/dev/urandom -r -n 4 words.txt

답변2

넌 아닌 것 같은데반대하다Perl이 아닌 솔루션의 경우 대부분의 시스템에서 실행될 무언가가 필요합니다. 이 경우 다음은 GNU 핵심 유틸리티만 사용합니다.

sort -R --random-source=/dev/urandom words.txt | head -n4 | paste -s -d' '

shufGilles의 제안에 따라 다음을 사용하도록 수정되었습니다.

shuf -n 4 -r words.txt | paste -s -d' '

답변3

(@Gilles가 언급한 보안 문제는 무시하세요)

 perl -0nE '@a=split; say join(" ", map{ $a[rand @a] } 1..4)'

아니면 CamelCase를 선호한다면...

 perl -0nE '@a=split; say map{ ucfirst $a[rand @a] } 1..4'

관련 정보