Làm thế nào để đọc trong N ký tự ngẫu nhiên từ / dev / urandom?


50
read /dev/urandom 3

Ở trên không hoạt động..Làm thế nào tôi có thể đọc các byte ngẫu nhiên từ /dev/urandomtrong bash?

Câu trả lời:


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

1
@ Flimzy, làm thế nào để $()làm việc?
linux

2
Nó xử lý đầu ra của một lệnh giống như một biến. Lưu ý: Đó là một bashism. Nếu bạn không sử dụng bash, bạn có thể cần sử dụng `` thay thế. `` là phổ quát hơn, nhưng tôi nghĩ $ () dễ đọc hơn.
Flimzy

@Flimzy, It treats the output of a command like a variable.bạn thực sự có nghĩa là chuỗi, phải không?
linux

2
Một biến có thể là một chuỗi ... hoặc một số. Nó coi nó như một biến số ... sau đó tùy thuộc vào ngữ cảnh, nó được coi như một chuỗi hoặc một số.
Flimzy

1
$()là khá phổ quát, không cụ thể bash. BTW, hãy cẩn thận, bạn không gặp phải những hạn chế về các ký tự mà shell có thể lưu trữ trong các biến - ví dụ: phiên bản bash mà tôi đã kiểm tra có loại bỏ null (\ x00) từ chuỗi.
Gordon Davisson

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

(Nếu bạn muốn các ký tự gạch ngang theo nghĩa đen, ký tự gạch ngang phải đi ở cuối chuỗi như đã làm ở trên, trái ngược với *-_).

Và để giải thích những gì được thực hiện do tập lệnh trên:

  1. head -c 500 /dev/urandom: Lấy 500 ký tự (byte) đầu tiên từ /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Xóa tất cả trừ các ký tự được chỉ định trong 'a-zA-Z0-9~!@#$%^&*_-'đầu ra của lệnh đầu tiên.
  3. fold -w 3: Định dạng đầu ra của lệnh thứ hai sao cho nó có 3 ký tự trên mỗi dòng.
  4. head -n 1: Hiển thị dòng đầu tiên của kết quả của lệnh thứ ba trên stdout.

1
Anh ấy đang tìm kiếm 3 byte ...
Chris S

1
3 mẫu chính xác
ADM

Thật tuyệt vời.
Danijel-James W

3
Tuyệt quá! Ngoài ra còn có các tên lớp char ([: graph | print | etc:]) có sẵn cho tr func và nó có thể được đơn giản hóa hơn nữa bằng cách thay thế fold -w 3 | head -n 1bằng một head -c 3nếu char không cần dòng char mới ở cuối.
Zimmi

5
Nếu mã hóa mặc định của hệ thống là multibyte (ví dụ UTF-8) thì tr sẽ bị Illegal byte sequencelỗi. Để khắc phục điều đó, hãy sử dụng mã hóa "C"; thay đổi lệnh thành:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
dev ware 10/11/2015

33

Vui lòng kiểm tra man od.

Bạn có thể sử dụng, ví dụ

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

để tạo số thập phân ngẫu nhiên 4 byte không dấu.


1
Xin chào, chào mừng đến với SF. Tôi thường không ủng hộ nhiều câu trả lời mới cho các câu hỏi được chấp nhận từ lâu, nhưng điều này thực sự khác với tất cả các câu trả lời trước đó và có một số lợi thế thực sự - tốt đẹp! +1 từ tôi và tôi hy vọng bạn sẽ ở quanh SF và đóng góp như thế này trong một thời gian tới.
MadHatter

19

Đây là một chuỗi tạo chuỗi cơ sở64, lưu ý rằng mặc dù chúng bị giới hạn ở chuỗi cơ sở64, phần đệm được xóa khỏi chúng, vì vậy bạn không thể giải mã chúng, dù sao bạn cũng sẽ không cần đến nó.

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

Thay thế 5bằng số ký tự bạn muốn.

Tuy nhiên, nếu bạn cần giải mã chúng vì một số lý do, hãy di chuyển base64đến cuối đường ống. Sau đó, nó sẽ thu thập 5 ký tự từ urandom và base64 mã hóa nó với phần đệm bên phải, nhưng chuỗi cuối cùng có thể dài hơn những gì bạn muốn do phần đệm.

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

Đây không phải là chính xác những gì câu hỏi đã được yêu cầu. Câu trả lời của bạn có thể vẫn hữu ích, nhưng câu hỏi không có đủ ngữ cảnh để nói chắc chắn.
kasperd

1
@kasperd Câu hỏi hỏi (trong tiêu đề) làm thế nào để đọc N ký tự ngẫu nhiên từ / dev / urandom nhưng trong cơ thể nó yêu cầu đọc byte. Tôi đồng ý có một sự không nhất quán. Tôi đã đến câu hỏi này từ Google để đọc các ký tự và tôi nghĩ rằng nó có thể giúp khách truy cập trong tương lai như một tùy chọn.
Umur Kontacı

Tôi nghĩ rằng câu trả lời của bạn là đơn giản nhất nhưng dễ hiểu nhất. Cảm ơn!
Robert

1
Sử dụng catsẽ đọc nhiều hơn một số lượng Nký tự nhất định và có thể làm mất entropy. Câu trả lời không hữu ích.
Bác sĩ Beco

1
Mặc dù Tiến sĩ Beco đúng rằng đây là một sự lạm dụng catvì cả hai base64headcó thể lấy tên tệp làm đối số, trong trường hợp này, nó hoạt động và không nên làm mất entropy. Xem stackoverflow.com/questions/10031344/
J.Money

11

Thử đi: dd if=/dev/urandom bs=1 count=3

Nếu bạn muốn đặt kết quả bằng $ biến:

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

Xin lưu ý rằng nó có thể sẽ không được in.


Lệnh này cũng có thể được sử dụng để đọc 3 byte ngẫu nhiên của dữ liệu nhị phân không?
Dimitrios Desyllas

6

Giải pháp đơn giản nhất sẽ đơn giản như:

$ head -cN /dev/urandom

2
Điều này thêm gì vào câu trả lời đã được đưa ra?
MadHatter

5
gọi đơn giản hơn
m.kocikowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.