एन / यादृच्छिक अक्षरों में / देव / उरजनीम से कैसे पढ़ें?


50
read /dev/urandom 3

ऊपर काम नहीं कर रहा है..क्या मैं /dev/urandomबैश से यादृच्छिक बाइट्स पढ़ सकता हूं ?

जवाबों:


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

1
@ इश्कबाज, कैसे $()काम करता है ?
linux

2
यह एक चर की तरह कमांड के आउटपुट को मानता है। नोट: यह एक बैशवाद है। यदि आप बैश का उपयोग नहीं कर रहे हैं, तो आपको इसके बजाय `` का उपयोग करने की आवश्यकता हो सकती है। `` अधिक सार्वभौमिक है, लेकिन मुझे लगता है कि $ () पढ़ना आसान है।
फ्लिमज़ी

@ ठीक है, It treats the output of a command like a variable.आप वास्तव में स्ट्रिंग के रूप में मतलब है, है ना?
लिनक्स

2
एक चर एक स्ट्रिंग हो सकता है ... या एक संख्या। यह इसे एक चर के रूप में मानता है ... फिर संदर्भ के आधार पर, यह एक स्ट्रिंग या एक संख्या की तरह व्यवहार किया जाता है।
टिमटिमा

1
$()बहुत सार्वभौमिक है, न कि बैश-विशिष्ट। BTW, सावधान रहें कि आप किन वर्णों में गोले को स्टोर कर सकते हैं, उन सीमाओं पर न चलें - उदाहरण के लिए, bash I के संस्करण को स्ट्रिंग से नल (\ x00) के पत्तों के साथ परीक्षण किया गया।
गॉर्डन डेविसन

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 बाइट्स की तलाश में है ...
क्रिस एस

1
3 प्लस सटीक पैटर्न
ADM

यह उत्कृष्ट है।
डैनिजेल-जेम्स डब्ल्यू

3
महान! ([: | प्रिंट | ग्राफ आदि:]) वहाँ भी वर्ण वर्ग नाम हैं टीआर समारोह के लिए उपलब्ध है, और यह आगे की जगह सरल किया जा सकता है fold -w 3 | head -n 1एक से head -c 3नई लाइन चार अंत में की जरूरत नहीं है, तो।
जिम्मी

5
यदि सिस्टम का डिफ़ॉल्ट एन्कोडिंग मल्टीबाइट है (उदाहरण के लिए UTF-8) तो tr एक Illegal byte sequenceत्रुटि के साथ विफल हो जाएगा । इसे ठीक करने के लिए, "सी" एन्कोडिंग का उपयोग करें; कमांड को बदल दें: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
एक्रेम, एसएफ में आपका स्वागत है। मैं आम तौर पर लंबे समय से स्वीकार किए गए सवालों के नए उत्तरों का पक्ष नहीं लेता, लेकिन यह वास्तव में पिछले सभी उत्तरों से अलग है, और इसके कुछ वास्तविक फायदे हैं - अच्छा! +1 मुझसे, और मुझे आशा है कि आप एसएफ के आसपास रहेंगे और आने वाले कुछ समय के लिए इस तरह का योगदान देंगे।
8

19

यहाँ एक है जो बेस 64 स्ट्रिंग्स बनाता है, ध्यान दें कि भले ही वे बेस 64 स्ट्रिंग्स तक सीमित हैं, पैडिंग उन्हें से हटा दिया जाता है, इसलिए आप उन्हें डिकोड नहीं कर सकते हैं, आपको शायद वैसे भी इसकी आवश्यकता नहीं होगी।

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

5आपके द्वारा पसंद किए जाने वाले वर्णों की संख्या के साथ बदलें ।

यदि आपको हालांकि किसी कारण से उन्हें डीकोड करने की आवश्यकता है, base64तो पाइप के अंत में जाएं। इसके बाद यह 5 आयामी यूरोग्रैम से इकट्ठा करेगा और base64 इसे सही पैडिंग के साथ एन्कोड करता है, लेकिन अंतिम स्ट्रिंग पैडिंग के कारण जो आप चाहते थे उससे अधिक लंबा हो सकता है।

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

यह वही नहीं है जो सवाल पूछ रहा था। आपका उत्तर अभी भी उपयोगी हो सकता है, लेकिन इस सवाल का पर्याप्त संदर्भ नहीं है।
कैस्परल्ड

1
@kasperd यह सवाल पूछता है (शीर्षक में) एन / रैंडम / यूरीगेम से यादृच्छिक अक्षर कैसे पढ़ें, लेकिन शरीर में यह बाइट्स पढ़ने के लिए कहता है। मैं मानता हूं कि एक विसंगति है। मैं वर्ण पढ़ने के लिए Google से इस प्रश्न पर आया था और मुझे लगता है कि यह भविष्य के आगंतुकों को एक विकल्प के रूप में मदद कर सकता है।
उमर कोंटाकी

मुझे लगता है कि आपका उत्तर समझने में सबसे आसान है। धन्यवाद!
रॉबर्ट

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 यादृच्छिक बाइट्स को पढ़ने के लिए भी कमांड का उपयोग किया जा सकता है?
दिमित्रियोस देसलेसस

6

सबसे आसान समाधान उतना ही सरल होगा:

$ head -cN /dev/urandom

2
यह पहले से दिए गए उत्तरों से क्या जोड़ता है?
मैडहैटर

5
सरल आह्वान
m.kocikowski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.