จะอ่านตัวอักษร N ตัวจาก / dev / urandom ได้อย่างไร?


คำตอบ:


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

1
@ Flimzy $()ทำงานอย่างไร
ลินุกซ์

2
มันปฏิบัติต่อการส่งออกของคำสั่งเหมือนตัวแปร หมายเหตุ: นั่นเป็นการทุบตี หากคุณไม่ได้ใช้ bash คุณอาจต้องใช้ `` แทน `` เป็นสากลมากขึ้น แต่ฉันคิดว่า $ () อ่านง่ายกว่า
Flimzy

@Flimzy It treats the output of a command like a variable.คุณหมายถึงสตริงใช่ไหม?
ลินุกซ์

2
ตัวแปรสามารถเป็นสตริง ... หรือตัวเลข มันถือว่าเป็นตัวแปร ... จากนั้นขึ้นอยู่กับบริบทมันจะถือว่าเป็นสตริงหรือตัวเลข
Flimzy

1
$()เป็นสากลสวยไม่เฉพาะทุบตี 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
ที่ดี! นอกจากนี้ยังมีชื่อคลาสถ่าน ([: กราฟ | พิมพ์ | ฯลฯ :]) สำหรับ tr func และสามารถทำให้ง่ายขึ้นโดยการแทนที่fold -w 3 | head -n 1ด้วย a 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

เพื่อสร้างตัวเลขสุ่มทศนิยม 4 ไบต์ที่ไม่ได้ลงชื่อ


1
Ekrem ยินดีต้อนรับสู่ SF ปกติฉันไม่ชอบคำตอบใหม่สำหรับคำถามที่ยอมรับมานาน แต่นี่แตกต่างจากคำตอบก่อนหน้านี้อย่างแท้จริงและมีข้อได้เปรียบที่แท้จริง - ดีมาก! +1 จากฉันและฉันหวังว่าคุณจะอยู่รอบ ๆ SF และมีส่วนร่วมเช่นนี้ในบางครั้ง
MadHatter

19

นี่คือสิ่งหนึ่งที่สร้างสตริง base64 โปรดทราบว่าแม้ว่าจะถูก จำกัด เฉพาะสตริง base64 แต่การแพ็ดดิ้งจะถูกลบออกจากพวกเขาดังนั้นคุณจึงไม่สามารถถอดรหัสได้ แต่คุณอาจไม่ต้องการมัน

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

แทนที่5ด้วยจำนวนตัวอักษรที่คุณต้องการ

หากคุณต้องการถอดรหัสอย่างไรก็ตามด้วยเหตุผลบางอย่างให้ย้ายbase64ไปยังจุดสิ้นสุดของไพพ์ จากนั้นจะรวบรวม 5 chars จาก urandom และ base64 เข้ารหัสด้วยการแพ็ดด้านขวา แต่สตริงสุดท้ายอาจยาวกว่าที่คุณต้องการเนื่องจากการแพ็ด

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

นี่ไม่ใช่คำถามที่ถามมา คำตอบของคุณอาจยังมีประโยชน์ แต่คำถามมีบริบทไม่เพียงพอที่จะพูดได้อย่างแน่นอน
kasperd

1
@kasperd คำถามที่ถาม (ในชื่อเรื่อง) วิธีการอ่านตัวอักษรสุ่ม N จาก / dev / urandom แต่ในร่างกายจะขออ่านไบต์ ฉันเห็นด้วยว่ามีความไม่สอดคล้องกัน ฉันมาที่คำถามนี้จาก Google เพื่ออ่านตัวละครและฉันคิดว่ามันอาจช่วยให้ผู้เข้าชมในอนาคตเป็นตัวเลือก
อายุKontacı

ฉันคิดว่าคำตอบของคุณง่ายที่สุด แต่เข้าใจง่ายที่สุด ขอบคุณ!
Robert

1
การใช้catจะอ่านมากกว่าจำนวนNตัวอักษรที่กำหนดและสามารถทำให้หมดสิ้นลงเอนโทรปี ไม่มีคำตอบที่เป็นประโยชน์
ดร. เบคโก

1
ในขณะที่ดร. เบโกก็ถูกต้องว่านี่เป็นการละเมิดcatเนื่องจากทั้งคู่base64และheadสามารถใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ในกรณีนี้มันใช้งานได้และไม่ควรทำให้หมดสิ้นลงกับเอนโทรปี ดูstackoverflow.com/questions/10031344/…
J.Money

11

ลองสิ่งนี้: dd if=/dev/urandom bs=1 count=3

หากคุณต้องการใส่ผลลัพธ์ในตัวแปร $:

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

โปรดทราบว่าอาจไม่สามารถพิมพ์ได้


สามารถใช้คำสั่งเพื่ออ่านข้อมูลไบนารี่แบบสุ่มขนาด 3 ไบต์ได้หรือไม่?
Dimitrios Desyllas

6

ทางออกที่ง่ายที่สุดจะง่ายเหมือน:

$ head -cN /dev/urandom

2
สิ่งนี้เพิ่มคำตอบที่ได้รับแล้ว?
MadHatter

5
การเรียกใช้ที่ง่ายขึ้น
m.kocikowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.