read /dev/urandom 3
ด้านบนไม่ทำงาน .. ฉันจะอ่านไบท์แบบสุ่มจาก/dev/urandom
ในทุบตีได้อย่างไร
read /dev/urandom 3
ด้านบนไม่ทำงาน .. ฉันจะอ่านไบท์แบบสุ่มจาก/dev/urandom
ในทุบตีได้อย่างไร
คำตอบ:
random="$(dd if=/dev/urandom bs=3 count=1)"
It treats the output of a command like a variable.
คุณหมายถึงสตริงใช่ไหม?
$()
เป็นสากลสวยไม่เฉพาะทุบตี BTW โปรดระวังว่าคุณจะไม่พบข้อ จำกัด เกี่ยวกับตัวอักษรที่เชลล์สามารถเก็บไว้ในตัวแปรได้ตัวอย่างเช่นเวอร์ชันของ bash ที่ฉันทดสอบโดยไม่ปล่อยค่า null (\ x00) ออกจากสตริง
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
(หากคุณต้องการตัวอักษรประอักษรตัวอักษรเส้นประจะต้องไปที่จุดสิ้นสุดของสตริงที่ทำข้างต้นเมื่อเทียบกับ*-_
)
และเพื่ออธิบายสิ่งที่เกิดขึ้นเนื่องจากชุดคำสั่งด้านบน:
head -c 500 /dev/urandom
: รับ 500 ตัวอักษรแรก (ไบต์) /dev/urandom
จากtr -dc 'a-zA-Z0-9~!@#$%^&*_-'
: ลบทั้งหมดยกเว้นอักขระที่ระบุใน'a-zA-Z0-9~!@#$%^&*_-'
จากเอาต์พุตของคำสั่งแรกfold -w 3
: จัดรูปแบบเอาต์พุตของคำสั่งที่สองเพื่อให้มี 3 อักขระต่อบรรทัด head -n 1
: stdout
แสดงบรรทัดแรกของผลของคำสั่งที่สามบนfold -w 3 | head -n 1
ด้วย a head -c 3
หากไม่จำเป็นต้องใช้อักขระบรรทัดใหม่ในตอนท้าย
Illegal byte sequence
ข้อผิดพลาด หากต้องการแก้ไขให้ใช้การเข้ารหัส "C" เปลี่ยนคำสั่งเป็น:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
man od
กรุณาตรวจสอบ
ตัวอย่างเช่นคุณสามารถใช้
od -vAn -N4 -tu4 < /dev/urandom
เพื่อสร้างตัวเลขสุ่มทศนิยม 4 ไบต์ที่ไม่ได้ลงชื่อ
นี่คือสิ่งหนึ่งที่สร้างสตริง base64 โปรดทราบว่าแม้ว่าจะถูก จำกัด เฉพาะสตริง base64 แต่การแพ็ดดิ้งจะถูกลบออกจากพวกเขาดังนั้นคุณจึงไม่สามารถถอดรหัสได้ แต่คุณอาจไม่ต้องการมัน
cat /dev/urandom | base64 | head -c 5
แทนที่5
ด้วยจำนวนตัวอักษรที่คุณต้องการ
หากคุณต้องการถอดรหัสอย่างไรก็ตามด้วยเหตุผลบางอย่างให้ย้ายbase64
ไปยังจุดสิ้นสุดของไพพ์ จากนั้นจะรวบรวม 5 chars จาก urandom และ base64 เข้ารหัสด้วยการแพ็ดด้านขวา แต่สตริงสุดท้ายอาจยาวกว่าที่คุณต้องการเนื่องจากการแพ็ด
cat /dev/urandom | head -c 5 | base64
cat
จะอ่านมากกว่าจำนวนN
ตัวอักษรที่กำหนดและสามารถทำให้หมดสิ้นลงเอนโทรปี ไม่มีคำตอบที่เป็นประโยชน์
cat
เนื่องจากทั้งคู่base64
และhead
สามารถใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ในกรณีนี้มันใช้งานได้และไม่ควรทำให้หมดสิ้นลงกับเอนโทรปี ดูstackoverflow.com/questions/10031344/…
ลองสิ่งนี้: dd if=/dev/urandom bs=1 count=3
หากคุณต้องการใส่ผลลัพธ์ในตัวแปร $:
variable=`dd if=/dev/urandom bs=1 count=3`
โปรดทราบว่าอาจไม่สามารถพิมพ์ได้
ทางออกที่ง่ายที่สุดจะง่ายเหมือน:
$ head -cN /dev/urandom
$()
ทำงานอย่างไร