Câu trả lời:
random="$(dd if=/dev/urandom bs=3 count=1)"
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?
$()
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.
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:
head -c 500 /dev/urandom
: Lấy 500 ký tự (byte) đầu tiên từ /dev/urandom
.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.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. 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
.fold -w 3 | head -n 1
bằng một head -c 3
nếu char không cần dòng char mới ở cuối.
Illegal byte sequence
lỗ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
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.
Đâ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ế 5
bằ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
cat
sẽ đọc nhiều hơn một số lượng N
ký tự nhất định và có thể làm mất entropy. Câu trả lời không hữu ích.
cat
vì cả hai base64
và head
có 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/
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.
Giải pháp đơn giản nhất sẽ đơn giản như:
$ head -cN /dev/urandom
$()
làm việc?