ওএসএক্সে / ডি / ইউরানডম থেকে কেন টিআর পড়তে পারে না?


35

একজন সহকর্মী নিম্নলিখিত কমান্ডের মাধ্যমে একটি এলোমেলো কী তৈরির পরামর্শ দিয়েছিলেন:

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

এটি আমাকে ত্রুটি দিয়েছে:

tr: অবৈধ বাইট অনুক্রম

আমি উদ্বিগ্ন যে /dev/urandomআমার সিস্টেমে আমার নেই। এই ফাইলটি ইনস্টল করতে কীভাবে তা গুগল করার চেষ্টা করেছি, তবে আমি খালি এসেছি। আমি চেষ্টা করেছিলাম locate urandomএবং খালিও এসেছি। (আসলে, এটি ম্যান পৃষ্ঠাটি পেয়েছে, তবে এটি কোনও উপকারে আসেনি)

আমি কীভাবে urandomআমার ম্যাক ওএসএক্স সিস্টেমে উপলব্ধ করব? (লায়ন)


3
এর আকর্ষণীয় ব্যবহার xargs...
সেন্ডমোরেইনফো

উত্তর:


49

আপনি যে ত্রুটি বার্তাটি পেয়েছেন তার উপর ভিত্তি করে, আমি মনে করি না / dev / urandom সমস্যা। যদি এটি হয় তবে আমি "এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" এর মতো একটি ত্রুটি আশা করব।

আপনি পেয়েছেন এমন ত্রুটি বার্তাটি আমি খুঁজে পেয়েছি এবং এটি পেয়েছি, যা দেখে মনে হচ্ছে এটি আপনার সমস্যার সাথে প্রাসঙ্গিক হতে পারে: http://nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-sequence

মূলত, 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
১০.৯-এ কাজ করছে বলে মনে হচ্ছে না; তবুও একই ত্রুটি বার্তাটি ব্যর্থ হয়। LC_ALL=Cকৌতুক না।
এরিক অলিক

1
অনুগ্রহ করে সেই লিঙ্কটি নার্ডবাইনেচার.ডে / এস9y/2010/04/11/tr- বৈধতা-বায়োট- সিকোয়েন্সিতে বর্তমানে পরিবর্তন হিসাবে তথ্যটি না থাকা সর্বাধিক সাম্প্রতিক ব্লগ পৃষ্ঠায় ইঙ্গিত trকরুন।
জেরোয়েন ওয়েয়ার্ট প্লাইমার্স

11

trইউটিএফ -8 এনকোডিংয়ে পাঠ্য হিসাবে এর ইনপুটটিকে ব্যাখ্যা করার জন্য আপনার প্রচেষ্টা। সুতরাং এটি অভিযোগ করবে এবং প্রথম বাইট ক্রমটি বাতিল করবে যা বৈধ ইউটিএফ -8 নয়। Prefixing 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পরিবর্তে enviornment নিয়ে সেনাবিভাগে মেসে খাবার OS X এর উপর কাজ করে varialbes, ব্যবহার perlস্থানে tr:

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

এটি ওএস এক্স, রেডহাট এবং উবুন্টু জুড়ে পোর্টেবল হওয়ার সুবিধা রয়েছে।

( আউটপুট শেষে একটি নতুন লাইন পেতে আমি xargsডাইনি প্রতিস্থাপন করে পাইপটিও সরিয়েছি echo))


যত তাড়াতাড়ি বা পরে, আমি পার্লকে binmode ":utf8"স্ট্যান্ডার্ড তৈরি করার প্রত্যাশা করছি , যার সময়ে আপনার পার্ল সমাধানের একই সমস্যা trদেখা দেবে।
চিহ্নিত করুন

কোড নমুনায় বিনমোড (STDIN, ": বাইটস") যুক্ত করে মার্কের উদ্বেগকে সম্বোধন করলেন।
ট্রেনটন

2

প্রথমত, আপনি বৈধ অক্ষরের তালিকাগুলি অন্তর্ভুক্ত করতে চান -বা অন্তর্ভুক্ত *করেছিলেন? প্যারামিটারের trক্রমটি অন্তর্ভুক্ত করা হয়েছে )-+যার অর্থ "বাইট সীমাটি শুরু )এবং এর সাথে শেষ হওয়া +, যা আসলে )*+

দ্বিতীয়ত, কার্নেলের এনট্রপি পুল থেকে অনেক কিলোবাইট পড়ার পরিবর্তে (এবং এটি পুরো পুলটিকে নিরাপত্তাহীন হিসাবে চিহ্নিত করে, যা অন্য যে কোনও প্রক্রিয়াতে সুরক্ষিত এনট্রপির প্রয়োজন হবে তার উপর প্রভাব ফেলবে) কেবল আপনার যতটা বিট পড়বে তা বিবেচনা করুন: প্রথম পদক্ষেপ head -c...হিসাবে ব্যবহার করুন , এবং তারপরে অনাকাঙ্ক্ষিত অক্ষরগুলি বাদ দেওয়ার পরিবর্তে অনুবাদ করুন।

সমস্যার এই নির্দিষ্ট সংস্করণটি কিছুটা অস্বাভাবিক যা এতে different 76 টি বিভিন্ন প্রতীক ব্যবহার করা হয়; সর্বাধিক কেবল বর্ণানুক্রমিক চান, সুতরাং আপনি যদি মাত্র 64৪ টি প্রতীক নিয়ে সন্তুষ্ট হন, তবে base64ইউটিলিটিটি ব্যবহারের ফলে এনট্রপি পুলের খরচ কমিয়ে দেওয়া হবে (দ্রষ্টব্য যে ২৪ এর মধ্যে //৮ হয়):

head -c24 < /dev/random | base64

1

আপনার লোকেলের চরিত্রের এনকোডিং (যা দিয়ে আপনি বলতে পারবেন locale charmap) এটি চরিত্র প্রতি একাধিক বাইট।

আজকাল সর্বাধিক সাধারণ ইউটিএফ -8 হ'ল অক্ষরগুলি 1 থেকে 4 বাইটের বেশি এনকোড করা যায়। বাইটগুলির সমস্ত ক্রমগুলি ইউটিএফ -8 এ বৈধ অক্ষর তৈরি করে না। ইউটিএফ -8 এর প্রতিটি অ-এসসিআইআই চরিত্রটি একটি বাইট দিয়ে শুরু হয় যেখানে দুটি সর্বোচ্চ বিট সেট রয়েছে এবং কতগুলি বাইট সর্বোচ্চ (তবে দ্বিতীয় সর্বোচ্চ নয়) বিট সেট অনুসরণ করে তা জানান with

/dev/urandomবাইটস এলোমেলো স্ট্রিম রয়েছে। trঅক্ষরকে লিখিতভাবে লিপিবদ্ধ করে, সুতরাং এটির জন্য সেই বাইটগুলি অক্ষর হিসাবে ডিকোড করা দরকার। আপনার পরিসীমাতে থাকা এএসসিআইআই অক্ষরগুলি সমস্ত ইউটিএফ -8-তে একটি অক্ষরে এনকোড করা আছে, তবে trএখনও সমস্ত অক্ষর ডিকোড করা দরকার। উদাহরণস্বরূপ অন্যান্য বহু-বাইট এনকোডিং রয়েছে যেখানে A0x41 বাইট (কোডের জন্য A) ব্যতীত কিছু অক্ষর রয়েছে ।

কারণ বাইটের এলোমেলো স্ট্রিমটি অবৈধ সিকোয়েন্সগুলিকে আবদ্ধ করতে বাধ্য (উদাহরণস্বরূপ, নিজে থেকে 0x80 বাইটটি ইউটিএফ -8 এ অবৈধ, কারণ একটি নন-এসসিআইআই অক্ষর একটি বাইটের সাথে শুরু করতে হবে যে 0xc1 (0xc0 এবং 0xc1 কোনও ইউটিএফ- তে নেই 8 টি অক্ষর)), সুতরাং trযখন ঘটে তখন একটি ত্রুটি নিয়ে ফিরে আসে।

আপনি এখানে যা চান তা হ'ল বাইটের স্ট্রিমটিকে এনকোডিংয়ের অক্ষর হিসাবে বিবেচনা করা হবে যার প্রতি অক্ষরে প্রতি বাইট রয়েছে। আপনি নির্বাচন যেটা আপনার সীমার মধ্যে সব গুরুত্বপূর্ণ যারা অক্ষর নয় (মত জেড দ্বারা অভিমানী, আপনি বোঝানো ABCDEFGHIJKLMNOPQRSTUVWXYZ এবং জিনিষ Ý, Ê) পোর্টেবল অক্ষর সেট তাই সব আপনার সিস্টেমে সমর্থিত ক্যারেক্টার-সেট একই এনকোড করা অংশ।

যে জন্য, আপনি সেট চাই LC_CTYPEস্থানীয়করণ পরিবর্তনশীল যা এক সিদ্ধান্ত নেয় যা অক্ষরসেট ব্যবহার করা হয় এবং কি ভালো জিনিস হয় blank, alphaচরিত্র শ্রেণীর ধারণ করে। তবে এজেড সীমার সংজ্ঞা দেওয়ার জন্য আপনি LC_COLLATEভেরিয়েবলটি সেট করতে চান (স্ট্রিং ক্রম সংক্রমণের সিদ্ধান্ত নেয় এমনটি)।

Cওরফে POSIXলোকেল এক একক বাইট যে নিশ্চয়তা অক্ষর এবং জেড 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_!@#$%^&*()+=-'

এটি ত্রুটি বার্তাগুলির ভাষার মতো অন্য জিনিসগুলিকে প্রভাবিত করবে, তবে যাইহোক, এলসি_সিটিওয়াইপি পরিবর্তন করা ইতিমধ্যে ত্রুটি বার্তাগুলির জন্য সমস্যা হতে পারে (উদাহরণস্বরূপ, সি লোকেলের অক্ষরে রুশ বা জাপানি ত্রুটি বার্তা প্রকাশ করার কোনও উপায় নয়)।


0

ম্যান পৃষ্ঠা অনুসারে , / dev / এলোমেলো সম্ভবত আপনার প্রয়োজনের জন্য যথেষ্ট হতে চলেছে। সম্ভবত অ্যাপল / ডি / ইউরেনডম তৈরি করা বন্ধ করে দিয়েছে কারণ এটি অপ্রয়োজনীয়?


আমারও নেই /dev/random
কर्क ওল

ম্যাকোসএক্সের / ডিভ / র্যান্ডম এবং / ডেভ / ইউরানডম উভয়ই থাকা উচিত। সম্ভবত অ্যাপল আর সেই বিশেষ ফাইলগুলি আর অন্তর্ভুক্ত করে না? অথবা আপনি কেবল এক্সকোড ইনস্টল করলেই কেবল এটি থাকবে?
jsbillings

1
এফডব্লিউআইডাব্লু, উভয় ডিভাইসই আমার লায়ন-আপগ্রেডড-টু-মাউন্টেন লায়ন ওয়ার্কস্টেশনে উপস্থিত রয়েছে। আমি বিশ্বাস করি এটি সিংহের উপরও ছিল। নোড ভিন্ন পাশাপাশি (13,0 বনাম 13,1)
mrb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.