मुझे एक साक्षात्कार में पूछा गया कि ऐसा क्यों है कि एक फाइल के लिए सभी अनुमतियाँ लेने के लिए 777 निर्धारित है। 555 क्यों नहीं? उन्होंने कहा कि हर चीज का कारण है। तो, 777 का कारण क्या है? कोई अन्य संख्या क्यों नहीं? क्या इस संख्या में कोई महत्व है?
मुझे एक साक्षात्कार में पूछा गया कि ऐसा क्यों है कि एक फाइल के लिए सभी अनुमतियाँ लेने के लिए 777 निर्धारित है। 555 क्यों नहीं? उन्होंने कहा कि हर चीज का कारण है। तो, 777 का कारण क्या है? कोई अन्य संख्या क्यों नहीं? क्या इस संख्या में कोई महत्व है?
जवाबों:
मैं अंतर्निहित कारण को संबोधित करने की कोशिश करूंगा कि यह आआआ, या 999 के बजाय 777 क्यों है।
याद रखें कि अनुमतियाँ निम्नलिखित प्रारूप में आती हैं:
u g o
rwx rwx rwx
जहां u = उपयोगकर्ता, जी = समूह, ओ = अन्य।
अब, कल्पना करें कि आप इनमें से प्रत्येक समूह को बाइनरी के रूप में दर्शा रहे हैं। १ सत्य है, ० मिथ्या है।
यदि आप सभी को पूर्ण पहुँच देना चाहते हैं, तो आप बाइनरी में निम्नलिखित अनुमतियाँ निर्दिष्ट करेंगे:
u g o
rwx rwx rwx
111 111 111
अब, यदि आप द्विआधारी जानते हैं, तो आप महसूस करेंगे कि जब आप 111
द्विआधारी से दशमलव में परिवर्तित करते हैं , तो आप प्राप्त करते हैं 7
।
इस प्रकार, आप के रूप में पूर्ण पहुँच का प्रतिनिधित्व कर सकते हैं 777
।
नोट: हम वास्तव में बाइनरी से ऑक्टल में परिवर्तित कर रहे हैं। नीचे संपादित देखें।
यह अन्य सभी एक्सेस मोड के लिए भी काम करता है।
उदाहरण के लिए, हम आसानी से 555
प्रत्येक 5
बाइनरी में कनवर्ट करके और इसे उपरोक्त प्रारूप में लिखकर क्या मतलब निकाल सकते हैं । 5
बाइनरी में है 101
, इसलिए हमारे पास निम्नलिखित अनुमतियाँ हैं:
u g o
r-x r-x r-x
101 101 101
5 5 5
इसी तरह, यदि हम उपयोगकर्ता को सभी अनुमति देना चाहते हैं, लेकिन केवल अन्य लोगों को पढ़ने की अनुमति देते हैं, तो हम एक संख्या प्रतिनिधित्व पा सकते हैं।
u g o
rwx r-- r--
111 100 100
7 4 4
अब, हम जानते हैं कि 111
बाइनरी 7
दशमलव में है, और 100
बाइनरी 4
दशमलव में है। इस प्रकार, अनुमति होगी 744
।
तकनीकी रूप से, जैसा कि @ LưuVPnhPhúc और @Braiam द्वारा हाइलाइट किया गया है, हम नीचे वर्णित के अनुसार, बाइनरी से ऑक्टल में परिवर्तित कर रहे हैं। हालांकि, संख्या <8 का दशमलव और अष्टक निरूपण समान हैं, इसलिए 3 अंकों या उससे कम के साथ द्विआधारी संख्याओं के लिए, दशमलव और अष्टक प्रतिनिधित्व दोनों समान हैं।
जब तीनों के समूहों में विभाजित होने और प्रत्येक समूह पर दशमलव रूपांतरण में द्विआधारी रूपांतरण करने के बजाय अष्टक संख्याओं के रूप में प्रतिनिधित्व किया जाता है, तो आप वास्तव में सभी तीन समूहों को एक ही बाइनरी संख्या के रूप में ले सकते हैं, और अष्टक में बदल सकते हैं।
उदाहरण के लिए, यहाँ अष्टांगिक रूपांतरण के लिए कुछ द्विआधारी हैं:
0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
ध्यान दें कि मैं "0b" और "0o" को द्विआधारी और अष्टाधारी संख्याओं के बीच भेद करने के लिए तैयार कर रहा हूं।
यदि आप इसके साथ खेलना चाहते हैं, python
तो एक टर्मिनल खोलें, चलाएं और फिर निम्नलिखित कमांड के साथ खेलें।
oct(0b111111111)
bin(0o555)
संख्या को "0b" या "0o" के रूप में प्रस्तुत करने के लिए याद रखें, ताकि कंप्यूटर को यह पता चल सके कि आप किस आधार में रुचि रखते हैं (यदि आप नहीं करते हैं, तो यह आधार 10. मान लेगा)
7
दशमलव और अष्टक में समान है - हालाँकि, 777
नहीं है। जब आप फ़्लिपिंग बिट्स के बारे में बात कर रहे हैं, तो इससे फर्क पड़ता है।
777
संदर्भित किया जाता है , जिनकी डिफ़ॉल्ट अनुमति कभी-कभी भगवान के रूप में संदर्भित होती है।
फ़ाइल अनुमति का मतलब पढ़ना, फ़ाइल अनुमति का मतलब 4
लिखना 2
और फ़ाइल अनुमति का निष्पादन करना 1
।
तो इस का कुल योग है 7
।
अब 777 क्या है: पहला 7
फाइल ओनर के लिए है, जिसका मतलब है कि फाइल ओनर ने रीड, राइट और एक्जीक्यूट की अनुमति दी है।
2 वें 7
उस समूह के लिए है जिसके पास फ़ाइल है, इसका मतलब है कि समूह में सभी पढ़ने, लिखने और अनुमति को निष्पादित करने के लिए भी है।
और तीसरा 7
दूसरों की अनुमति के लिए है
यदि आप फ़ाइल की अनुमति देते हैं 555
तो फ़ाइल के owner, group and others
पास केवल अनुमति है read
और execute
अनुमति not write
है क्योंकि रीड अनुमति का मतलब 4 है और निष्पादित का अर्थ है 1 तो कुल प्राप्त होता है5
शीर्ष उत्तर के रूप में इतने सारे शब्दों में नहीं:
प्रत्येक फ़ाइल में 3 अनुमतियाँ विकल्प होते हैं: पढ़ना, लिखना और निष्पादित करना। आप इनमें से कोई भी चुन सकते हैं, इनमें से एक, इनमें से दो या इनमें से कोई भी:
C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8
1 + 3 + 3 + 1 = 8
तो, कुल मिलाकर, 8 संयोजन हैं; अनुमतियों के लिए 8 विकल्प। 0 से गिनती, अंतिम संख्या 7 (0 से 7 तक) है। इसलिए, संख्याओं द्वारा दर्शाया गया है, यहाँ सभी विकल्प हैं:
0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
तीन नंबर हैं क्योंकि ऑर्डर चला जाता है [उपयोगकर्ता की अनुमति] [समूह की अनुमति] [दूसरों की अनुमति]
तो, 777 का मतलब है कि सभी तीन समूहों ने अनुमतियों को पढ़ा, लिखा और निष्पादित किया है।
read
?
0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)
सभी संभावनाओं के लिए अद्वितीय संयोजन प्राप्त करने का एकमात्र तरीका मूल विकल्पों के लिए 2 की शक्तियों से जाना है। 2 0 = 1 (निष्पादित करें), 2 1 = 2 (लिखिए), 2 2 = 4 (पढ़ें), और यदि कोई 4 वाँ मूल विकल्प था तो उसे 2 3 = 8 गिना जाएगा । ध्यान दें कि write
सभी संयोजनों तक सूचीबद्ध नहीं है पिछले विकल्पों को सूचीबद्ध किया गया है (जो कि सिर्फ एक विकल्प है, क्योंकि यह सिर्फ है execute
)। read
तब तक सूचीबद्ध नहीं किया जाता है जब तक कि पिछले विकल्पों के सभी संयोजनों को सूचीबद्ध नहीं किया गया है (फिर से एक, क्योंकि दो विकल्पों के साथ केवल एक संयोजन है - execute
+ write
)। execute
+ write
+read
तब तक सूचीबद्ध नहीं किया जाता है जब तक कि पिछले सभी संयोजनों को सूचीबद्ध नहीं किया जाता है, जो कि 3 है, क्योंकि अब तीन अनुमतियों में से दो विकल्प हैं। सूची इस तरह से जारी रहेगी, चाहे कितने भी बुनियादी विकल्प हों। उदाहरण के लिए, 4 मूल विकल्पों के साथ (ध्यान दें कि हम यह भी जानते हैं कि कुल 16 संयोजन होंगे क्योंकि 4 विकल्प और 2 4 = 16 हैं):
0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)
किसी कारण से, UNIX डिजाइनरों ने फ़ाइल अनुमतियों के लिए OCTAL संख्याओं का उपयोग करने का निर्णय लिया । जैसा कि आप जानते हैं, एक-अंकों वाले ऑक्टल नंबर के लिए एक अधिकतम मूल्य है। 7. यह पता चला है कि उपयोगकर्ता एक्सेस के लिए एक ऑक्टल अंक, समूह एक्सेस के लिए एक और विश्व एक्सेस के लिए लगभग सभी चीज़ों के लिए पर्याप्त है। अधिकतम 3 डी ऑक्टिकल संख्या 777 है, और यह केवल समझ में आता है कि यह "हर किसी / हर चीज तक पहुंच" को दर्शाता है।
आजकल, हम सभी जानते हैं कि एक बाइट 8 बिट्स है : यह दशकों से सार्वभौमिक रूप से सहमत है। लेकिन यह हमेशा ऐसा नहीं होता था, और यूनिक्स (जो कई मायनों में लिनक्स से प्रेरित था) उस समय के दौरान लिखा गया था जब इस पर अभी भी बहस चल रही थी। विशेष रूप से, यह उन प्रणालियों के लिए पोर्टेबल होना चाहिए जो 6-बिट बाइट्स या 8-बिट बाइट्स का उपयोग करते हैं। जिन लोगों ने इसे लिखा था उनमें से कुछ बहस के एक तरफ थे, और अन्य लोग दूसरी तरफ थे।
संबंधित नोट पर, बेस -2 (बाइनरी) मानों को लिखने के लिए बहुत सुविधाजनक संकेतन नहीं है। आजकल, अधिकांश प्रोग्रामर एक अधिक कॉम्पैक्ट नोटेशन लिखते हैं जो इसके बजाय बेस -16 (हेक्साडेसिमल) का उपयोग करता है। 16 बस एक आधार के लिए पर्याप्त बड़ा है जिसे आप चार बिट्स को एक हेक्स-अंक में पैक कर सकते हैं: उदाहरण के लिए, बाइनरी में "0000" हेक्साडेसिमल में 0x0 है (यह "0x" एक सामान्य तरीका है नोट करने के लिए कि आप के बारे में हैं हेक्साडेसिमल संख्या लिखें), जबकि "1111" 0xF (या दशमलव में 15) है। आप वास्तव में एक एकल हेक्स अंक का उपयोग करके चार बिट्स के किसी भी संभावित संयोजन को लिख सकते हैं, बस बाइनरी में गिनती करके, और जिस तरह से स्थिति अंकगणितीय कार्यों के कारण, आप इसे ढेर कर सकते हैं: दो हेक्स अंक आठ बिट्स के किसी भी संभावित संयोजन को सांकेतिक शब्दों में बदल सकते हैं, बस गिनती से, और इसी तरह। तो 8 बिट वालों को यह पसंद आया।
6-बिट लोगों के पास ऐसा करने का अपना तरीका था, लेकिन बेस -16 का उपयोग करने के बजाय, उन्होंने बेस -8 (ऑक्टल) का उपयोग किया। यह हेक्साडेसिमल के समान फायदे हैं: आप तीन बिट्स की किसी भी स्थिति को एक ऑक्टल-अंक में संग्रहीत कर सकते हैं, और आप एक समान तरीके से अंकों को ढेर कर सकते हैं। तो जैसे 8-बिट वाले लोगों ने बाइट के लिए दो हेक्स-डिजिट का इस्तेमाल किया, वैसे ही 6-बिट्स लोगों ने बाइट के लिए दो ऑक्टल-डिजिट का इस्तेमाल किया। आप ऑक्टल को बहुत अधिक नहीं देखते हैं, लेकिन यह आमतौर पर एक अग्रणी शून्य के साथ नोट किया गया था: उदाहरण के लिए, "111" ऑक्टल में 07 है।
अब, यूनिक्स अनुमतियों के साथ यह सब क्या करना है? जहां तक यूनिक्स का संबंध था, एक फ़ाइल के साथ आप तीन चीजें कर सकते थे: आप इसे पढ़ सकते थे, आप इसे लिख सकते थे, या आप इसे एक कार्यक्रम के रूप में निष्पादित कर सकते थे। यदि आप उन अनुमतियों को प्रतिबंधित करने जा रहे हैं, तो आपको उनमें से प्रत्येक के लिए थोड़ा सा चाहिए: इसे उन चीजों के लिए चालू करें जो किसी को करने की अनुमति है, और इसे उन चीजों के लिए छोड़ दें जो किसी को करने की अनुमति नहीं है। चूंकि तीन चीजें ट्रैक की जा रही हैं, आपको तीन बिट्स की आवश्यकता है, और चूंकि यूनिक्स इसे तीन लाइनों (स्वामी, समूह और सभी) के साथ ट्रैक करता है, इसलिए आपको कुल नौ बिट्स की आवश्यकता है।
रेखा के साथ किसी बिंदु पर, 6-बिट शिविर में किसी-किसी ने- "अरे, हम इसके लिए अष्टक-अंकों का उपयोग कर सकते हैं" । और यह एक बहुत ही सुविधाजनक अंकन निकला: तीन ऑक्टल-अंक बिट क्षेत्रों के हर संभव संयोजन को एन्कोड करने के लिए बस पर्याप्त है। एक बार जब उन्होंने ऐसा करने का फैसला किया, तो 777 के भाग्य (और 000) को सील कर दिया गया, क्योंकि वे संख्याएं समान होंगी, चाहे वे बिट्स की व्यवस्था कैसे करें, लेकिन अन्य सभी संख्याओं के लिए आदेश दिया गया था, इसलिए उन्होंने ऐसा करने के बारे में निर्धारित किया।
उन्होंने अनुमतियों को तीन-बिट फ़ील्ड में व्यवस्थित किया: प्रारंभ में पढ़ा, बीच में लिखें, और अंत में निष्पादित करें। फिर उन्होंने खुद खेतों की व्यवस्था की: शुरू में मालिक, बीच में समूह, और अंत में अन्य। एक बार जब वे ऐसा कर लेते हैं, तो उन्हें बाकी सभी नंबरों की गिनती करने के लिए करना पड़ता है।
क्योंकि वे 3-बिट फ़ील्ड हैं, आप कह सकते हैं कि प्रत्येक ऑक्टल-अंक फ़ील्ड में से एक को नियंत्रित करता है : पहला अंक मालिक की अनुमतियों को नियंत्रित करता है, दूसरा अंक समूह की अनुमतियों को नियंत्रित करता है, और तीसरा अंक अन्य अनुमतियों को नियंत्रित करता है। इस प्रकार, 777 (111 111 111) सभी के लिए सभी अनुमतियाँ हैं, जबकि 700 (111 000 000) केवल स्वामी के लिए सभी अनुमतियाँ हैं। अन्य संयोजन भी आम हैं: 666 (110 110 110) सभी के लिए पढ़ा / लिखा जाता है लेकिन निष्पादित नहीं होता है), जबकि 555 (101 101 101) हर किसी के लिए पढ़ा / निष्पादित होता है, लेकिन लिखता नहीं है, और 400 (100 000 000) पढ़ा जाता है- केवल मालिक के लिए और किसी और के लिए कोई पहुँच नहीं।
और इसीलिए 777 का मतलब है सभी परमिशन। इन दिनों, यह शायद लोगों के लिए सबसे लोकप्रिय अष्टाध्यायी का उपयोग करने का सबसे लोकप्रिय कारण है, हालांकि यूनिक्स और इसके वंशजों के पास अभी भी इसके कुछ अन्य संस्करण हैं। उदाहरण के लिए, od
या ऑक्टल डंप, ऑक्टल रूप में फ़ाइल के बाइनरी डंप को प्राप्त करने का एक तरीका है (इसमें हेक्साडेसिमल चचेरा भाई है, जिसे कहा जाता है xxd
, लेकिन यह उतना प्रसिद्ध नहीं है और हर जगह उपलब्ध नहीं है)। यह भी है कि आपको कुछ प्रोग्रामिंग भाषाओं में अग्रणी शून्य के साथ सावधान रहने की आवश्यकता है, क्योंकि वे सोच सकते हैं कि आप ऑक्टल में नंबर लिखने का इरादा रखते हैं जब कि वास्तव में आपका इरादा नहीं है।