/ dev / urandom에서 N 개의 임의 문자를 읽는 방법은 무엇입니까?


50
read /dev/urandom 3

위의 작업이 작동하지 않습니다 .Bash에서 임의 바이트를 /dev/urandom어떻게 읽을 수 있습니까?

답변:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

1
@Flimzy, 어떻게 $()작동합니까?
리눅스

2
명령 출력을 변수처럼 취급합니다. 참고 : 그것은 bashism입니다. bash를 사용하지 않는다면 대신``를 사용해야 할 수도 있습니다. ``보다 보편적이지만 $ ()가 읽기 쉽다고 생각합니다.
Flimzy 2016 년

@Flimzy, It treats the output of a command like a variable.실제로 문자열로 의미합니까?
리눅스

2
변수 문자열 또는 숫자 일 수 있습니다. 변수로 취급합니다 ... 문맥에 따라 문자열 또는 숫자처럼 취급됩니다.
Flimzy 2016 년

1
$()bash 특정이 아닌 매우 보편적입니다. BTW, 쉘이 변수에 저장할 수있는 문자에 제한을 두지 않도록주의하십시오. 예를 들어 테스트 한 bash 버전은 문자열에서 null (\ x00)을 제외합니다.
Gordon Davisson

44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

리터럴 대시 문자를 원할 경우, 대시 문자는와 달리 문자열의 끝 부분에 있어야합니다 *-_.

그리고 위의 명령 세트로 인해 수행되는 작업을 설명합니다.

  1. head -c 500 /dev/urandom:에서 첫 500 자 (바이트)를 얻습니다 /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': 첫 번째 명령의 출력에서 지정된 문자를 제외한 모든 문자를 제거하십시오 'a-zA-Z0-9~!@#$%^&*_-'.
  3. fold -w 3: 두 번째 명령의 출력을 한 줄에 3 자씩 형식화하십시오.
  4. head -n 1:에 세 번째 명령 결과의 첫 번째 행을 표시합니다 stdout.

1
그는 3 바이트를 찾고 있습니다 ...
크리스 S

1
3 플러스 정확한 패턴
ADM

이것은 우수하다.
Danijel-James W

3
큰! ([: | 인쇄 | 그래프 등 :])가 숯불 클래스 이름도있는 그럴 FUNC 사용할 수는, 그것은 더를 대체하여 단순화 할 수 fold -w 3 | head -n 1a로 head -c 3새로운 라인 문자가 마지막에 필요하지 않은 경우.
Zimmi

5
시스템의 기본 인코딩이 멀티 바이트 (예 : UTF-8)이면 tr은 오류와 함께 실패 Illegal byte sequence합니다. 이를 해결하려면 "C"인코딩을 사용하십시오. 에 명령을 변경 :head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff

33

확인하시기 바랍니다 man od.

예를 들어 사용할 수 있습니다

od -vAn -N4 -tu4 < /dev/urandom

부호없는 10 진수 4 바이트 난수를 생성합니다.


1
Ekrem, SF에 오신 것을 환영합니다. 나는 일반적으로 오랫동안 받아 들여진 질문에 대한 새로운 답변을 많이 좋아하지 않지만 이것은 이전의 모든 답변과 진정으로 다르며 몇 가지 실질적인 장점이 있습니다. 나에게서 +1하고, 나는 당신이 SF 주변에 머무르고 앞으로도 이와 같이 기여하기를 바랍니다.
MadHatter

19

다음은 base64 문자열을 생성하는 것입니다. base64 문자열로 제한되어 있어도 패딩이 제거되므로 디코딩 할 수 없으므로 어쨌든 필요하지 않을 것입니다.

 cat /dev/urandom | base64 | head -c 5

대체 5당신이 원하는 문자의 수.

그러나 어떤 이유로 든 디코딩해야하는 경우 base64파이프 끝으로 이동 하십시오. 그런 다음 urandom에서 5 문자를 수집하고 올바른 패딩으로 base64로 인코딩하지만 마지막 문자열은 패딩으로 인해 원하는 것보다 길 수 있습니다.

cat /dev/urandom | head -c 5 | base64

이것이 바로 질문이 요구 한 것이 아닙니다. 귀하의 답변은 여전히 ​​유용 할 수 있지만, 질문에 대한 충분한 문맥이 없습니다.
kasperd

1
@kasperd 질문은 (제목에서) / dev / urandom에서 N 개의 임의 문자를 읽는 방법을 묻지 만 본문에서는 바이트를 읽도록 요청합니다. 불일치가 있음에 동의합니다. 나는 문자를 읽기 위해 Google 에서이 질문에 왔으며 앞으로의 방문자가 옵션으로 도움이 될 것이라고 생각합니다.
Umur Kontacı

나는 당신의 대답이 가장 간단하지만 이해하기 쉽다고 생각합니다. 감사!
Robert

1
를 사용 cat하면 주어진 양보다 많은 N문자 를 읽고 엔트로피를 고갈시킬 수 있습니다. 유용한 답변이 아닙니다.
Dr Beco

1
박사 BECO은이의 남용이다 올바른 동안 cat모두 이후가 base64head작동 및 엔트로피를 고갈 안이 경우, 인수로 파일 이름을 걸릴 수 있습니다. stackoverflow.com/questions/10031344/…
J.Money

11

이 시도: dd if=/dev/urandom bs=1 count=3

결과를 $ variable에 넣으려면 다음을 수행하십시오.

variable=`dd if=/dev/urandom bs=1 count=3`

인쇄 할 수 없을 수도 있습니다.


3 바이트의 이진 데이터를 읽기 위해 명령을 사용할 수도 있습니까?
Dimitrios Desyllas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.