OSX पर / dev / urandom से क्यों नहीं पढ़ा जा सकता है?


35

एक सहयोगी ने निम्नलिखित कमांड के माध्यम से एक यादृच्छिक कुंजी बनाने का सुझाव दिया:

tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs

इसने मुझे त्रुटि दी:

tr: अवैध बाइट अनुक्रम

मुझे चिंता है कि /dev/urandomमेरे सिस्टम पर नहीं है । मैंने यह जानने की कोशिश की कि इस फाइल को कैसे स्थापित किया जाए, लेकिन मैं खाली हो गया हूं। मैंने कोशिश की locate urandomऔर खाली भी आया। (वास्तव में, यह आदमी पृष्ठ मिला, लेकिन यह मदद नहीं करता है)

मैं urandomअपने मैक ओएसएक्स सिस्टम पर कैसे उपलब्ध कर सकता हूं? (शेर)


3
दिलचस्प उपयोग xargs...
sendmoreinfo

जवाबों:


49

आपको मिलने वाले त्रुटि संदेश के आधार पर, मुझे नहीं लगता कि / dev / urandom समस्या है। अगर ऐसा होता, तो मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं" जैसी त्रुटि की उम्मीद थी।

मुझे आपके द्वारा प्राप्त त्रुटि संदेश की खोज हुई, जो ऐसा लगता है कि यह आपके मुद्दे के लिए प्रासंगिक हो सकता है: http://nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-fterence

मूल रूप से, trकमांड को पूर्व निर्धारित करके स्थान निर्दिष्ट करें LC_CTYPE=C:

LC_CTYPE=C tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs

धन्यवाद, कि वास्तव में चाल चली गई। किसी भी विचार क्यों मैं urandomया नहीं मिल सकता है random? क्या वे विशेष जादुई "फाइलें" हैं जो वास्तविक फाइल सिस्टम पर मौजूद नहीं हैं? (इसके अलावा मैंने लिंक-रोट को कम करने में मदद करने के लिए एक संपादन का सुझाव दिया)
कर्क वुल्ल

1
मेरा मानना locateहै कि सीधे आपके फाइलसिस्टम की खोज नहीं होती है, बल्कि एक पूर्व-निर्मित डेटाबेस का उपयोग करके अपनी क्वेरी को देखता है। इस डेटाबेस को अनदेखा / dev / और अन्य 'विशेष' फाइल सिस्टम के लिए कॉन्फ़िगर किया गया है।
lk-

काफी उचित है, लेकिन जब मैं सीधे अंदर देखता हूं तो मैं इसे नहीं देखता /dev। जाओ पता लगाओ। लेकिन मदद के लिए फिर से धन्यवाद।
कर्क वुल्ल

1
10.9 पर काम नहीं लगता है; अभी भी एक ही त्रुटि संदेश के साथ विफल रहता है। LC_ALL=Cचाल को विफल करता है।
एरिक अल्लिक

1
कृपया उस लिंक को nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-fterence से लिंक करें क्योंकि यह वर्तमान trजानकारी को न रखने वाले सबसे हाल के ब्लॉग पेज की ओर इशारा करता है ।
जीरो वेर्ट प्ल्यूमर

11

trUTF-8 एन्कोडिंग में पाठ के रूप में इसके इनपुट की व्याख्या करने का आपका प्रयास। तो यह शिकायत करेगा और पहले बाइट अनुक्रम पर गर्भपात करेगा जो मान्य UTF-8 नहीं है। के trसाथ उपसर्ग करना LC_ALL=Cया LC_CTYPE=Cउस चर को पर्यावरण में निर्यात करना tr, इस प्रकार सी मानक के लिए सेट स्थानीय चरित्र के अपने विचार को बदलना, यानी सब कुछ सिर्फ अपारदर्शी बाइट्स का एक क्रम है।

वैसे, क्या \)-+आपकी आज्ञा में अनुक्रम जानबूझकर है? इसमें वह भी शामिल है *, जिसे आपने पहले ही शामिल कर लिया था, लेकिन इसमें वह शामिल नहीं है, -जैसा आपने अभी तक किया है। इसके बजाय इनमें से एक लिखने के लिए बेहतर है:

LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()\-+=' < /dev/urandom
LC_CTYPE=C tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)\\-+= < /dev/urandom

6

जैसा कि दूसरों ने संकेत दिया है, आपकी समस्या /dev/urandomगायब नहीं है , बल्कि trओएस एक्स पर कैसे काम करती है। इसके बजाय एन्वॉर्नमेंट वेरिएबल्स के साथ खिलवाड़ करने के बजाय, इसके perlस्थान पर उपयोग करें tr:

perl -pe 'binmode(STDIN, ":bytes"); tr/A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+=//dc;' < /dev/urandom | head -c 32; echo

इससे OS X, Redhat और Ubuntu में पोर्टेबल होने का फायदा है।

(मैंने आउटपुट के अंत में एक नई रूपरेखा प्राप्त करने के लिए, xargsविच की जगह, पाइप को भी हटा दिया echo।)


जल्दी या बाद में, मैं पर्ल को binmode ":utf8"मानक बनाने की उम्मीद करता हूं , जिस बिंदु पर आपके पर्ल समाधान में वही समस्या होगी tr
मार्क

कोड नमूने में Binmode (STDIN, ": बाइट्स") को जोड़कर मार्क की चिंता का विषय है।
ट्रेंटन

2

सबसे पहले, क्या आपने वैध पात्रों की सूची में शामिल करने -या बनाने का इरादा किया था *? trअनुक्रम को शामिल करने के लिए पैरामीटर )-+जिसका अर्थ है "बाइट रेंज जिसके )साथ शुरू और समाप्त होता है +, जो वास्तव में है )*+

दूसरे, कर्नेल के एंट्रोपी पूल से कई किलोबाइट पढ़ने के बजाय (और इस तरह पूरे पूल को असुरक्षित के रूप में चिह्नित किया जाता है, जो किसी भी अन्य प्रक्रियाओं को प्रभावित करेगा जो सुरक्षित प्रवेश की आवश्यकता है), केवल आवश्यकतानुसार कई बिट्स को पढ़ने पर विचार करें head -c..., पहले चरण के रूप में उपयोग करें । और फिर अवांछित पात्रों को त्यागने के बजाय अनुवाद करें।

समस्या का यह विशेष संस्करण थोड़ा असामान्य है जिसमें 76 विभिन्न प्रतीकों का उपयोग किया गया है; अधिकांश केवल अल्फ़ान्यूमेरिक चाहते हैं, इसलिए यदि आप सिर्फ 64 प्रतीकों से संतुष्ट होंगे, तो base64उपयोगिता का उपयोग करने से एन्ट्रापी पूल की खपत कम हो जाएगी (ध्यान दें कि 24 32 का 6/8 है):

head -c24 < /dev/random | base64

1

आपके लोकेल का कैरेक्टर एन्कोडिंग (जिसे आप बता सकते हैं locale charmap) एक मल्टी-बाइट प्रति कैरेक्टर एक है।

आजकल सबसे आम यूटीएफ -8 है जहां पात्रों को 1 से 4 बाइट्स पर एन्कोड किया जा सकता है। यूटीएफ -8 में बाइट्स के सभी अनुक्रम वैध वर्ण नहीं बनाते हैं। UTF-8 में प्रत्येक गैर-ASCII चरित्र एक बाइट के साथ शुरू होता है जिसमें दो उच्चतम बिट्स सेट होते हैं और बताते हैं कि कितने बाइट उच्चतम (लेकिन दूसरे-उच्चतम) बिट सेट का अनुसरण नहीं करते हैं।

/dev/urandomबाइट्स की एक यादृच्छिक धारा शामिल है। trचरित्र का अनुवाद करता है, इसलिए इसे उन बाइट्स को पात्रों के रूप में डिकोड करना होगा। आपकी श्रेणी के वे ASCII वर्ण सभी UTF-8 में एक वर्ण पर एन्कोडेड हैं, लेकिन फिर trभी सभी वर्णों को डीकोड करने की आवश्यकता है। उदाहरण के लिए अन्य मल्टी-बाइट एन्कोडिंग हैं, जहां A0x41 बाइट (कोड के लिए A) के अलावा कुछ वर्ण हैं ।

चूँकि बाइट्स की रैंडम स्ट्रीम में अमान्य अनुक्रम होते हैं (उदाहरण के लिए 0x80 बाइट अपने आप में UTF-8 में अमान्य है क्योंकि गैर-ASCII वर्ण को बाइट के साथ शुरू करना पड़ता है कि 0xc1 (0xc0 और 0xc1) कोई UTF- में नहीं हैं 8 वर्ण)), ऐसा trहोने पर एक त्रुटि के साथ लौटता है।

यहां आप जो चाहते हैं, उस बाइट की धारा को एन्कोडिंग के पात्रों के रूप में माना जाता है, जिसमें प्रति वर्ण एक बाइट होता है। जो भी आप चुनते हैं, वह आपकी सीमा के सभी वर्णों के रूप में महत्वपूर्ण नहीं है (AZ द्वारा मान लिया गया है, आपका मतलब ABCDEFGHIJKLMNOPQRSTUVWXYZ है और जैसी चीजें नहीं हैं ) Ý, Êपोर्टेबल वर्ण सेट का हिस्सा हैं , इसलिए आपके सिस्टम पर समर्थित सभी वर्णमालाओं में समान है।

उसके लिए, आप LC_CTYPEस्थानीयकरण चर सेट करेंगे जो वह है जो यह तय करता है कि किस वर्ण का उपयोग किया गया है और कौन सी चीजें पसंद हैं blank, alphaचरित्र वर्ग शामिल हैं। लेकिन AZ रेंज की परिभाषा के लिए, आप LC_COLLATEचर (स्ट्रिंग ऑर्डर करने का निर्णय लेने वाला) को भी सेट करना चाहेंगे ।

Cउर्फ POSIXस्थान एक एकल बाइट्स कि गारंटी देता है चरित्र है और AZ ABCDEFGHIJKLMNOPQRSTUVWXYZ है। तुम यह कर सकते थे:

 LC_CTYPE=C LC_COLLATE=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'

(यहां -अंत तक आगे बढ़ना , अन्यथा, )-+एक सीमा के रूप में लिया जाएगा A-Z)

लेकिन ध्यान दें कि LC_ALLचर सभी अन्य LC_*और LANGचर को ओवरराइड करता है । इसलिए, यदि LC_ALLअन्यथा पहले से परिभाषित किया गया है, तो ऊपर का कोई प्रभाव नहीं होगा। तो इसके बजाय आप बस कर सकते हैं:

 LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'

यह त्रुटि संदेशों की भाषा जैसी अन्य चीजों को प्रभावित करेगा, लेकिन वैसे भी, LC_CTYPE को बदलना पहले से ही त्रुटि संदेशों (उदाहरण के लिए, सी लोकेल की वर्णमाला में रूसी या जापानी त्रुटि संदेशों को व्यक्त करने का कोई तरीका नहीं) के लिए एक समस्या हो सकती थी।


0

मैन पेज के अनुसार , / देव / यादृच्छिक शायद आपकी आवश्यकताओं के लिए पर्याप्त होने जा रहा है। शायद Apple / dev / urandom बनाना बंद हो गया क्योंकि यह अनावश्यक है?


मेरे पास भी नहीं है /dev/random
कर्क वाह

MacOSX में दोनों / देव / रैंडम और / देव / यूरेनियम होना चाहिए। शायद Apple अब उन विशेष फ़ाइलों को शामिल नहीं करता है? या शायद यह केवल वहाँ है अगर आप XCode स्थापित करते हैं?
jsbillings

1
एफडब्ल्यूआईडब्ल्यू, दोनों डिवाइस मेरे लायन-अपग्रेड-टू-माउंटेन लायन वर्कस्टेशन पर मौजूद हैं। मेरा मानना ​​है कि यह शेर पर भी मौजूद था। नोड्स अलग-अलग हैं (13,0 बनाम 13,1)
mrb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.