कुछ umask मान क्यों प्रभावी नहीं होते हैं?


9

मैं अनुमतियों को बेहतर ढंग से समझने की कोशिश कर रहा हूं, इसलिए मैं कुछ "अभ्यास" कर रहा हूं। यहां उन कमांड का एक क्रम है जो मैं उनके संबंधित आउटपुट के साथ उपयोग कर रहा हूं:

$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1

इसका मतलब यह है क्योंकि हम जानते हैं कि डिफ़ॉल्ट फ़ाइल अनुमतियाँ हैं 666( rw-rw-rw-) और निर्देशिका डिफ़ॉल्ट अनुमतियाँ हैं 777( rwxrwxrwx)। अगर मैं मैं इन डिफ़ॉल्ट अनुमतियों से umask मूल्य घटाना 666-022=644, rw-r--r--, के लिए file1है, इसलिए पिछले उत्पादन के साथ यह सुसंगत; 777-022=755, के rwx-r-x-r-xलिए dir1भी, सुसंगत।

लेकिन अगर मैं umask 022को 021इससे बदल दूं तो यह और नहीं है।

यहाँ फ़ाइल के लिए उदाहरण है:

$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2

-rw-r--rw-है 646, लेकिन यह होना चाहिए 666-021=645। तो यह पिछले गणना के अनुसार काम नहीं करता है।

यहाँ निर्देशिका के लिए उदाहरण है:

$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2

drwxr-xrw-है 756, 777-021=756। तो इस मामले में परिणाम पिछले गणना के साथ सुसंगत है।

मैंने आदमी को पढ़ा है, लेकिन मुझे इस व्यवहार के बारे में कुछ नहीं मिला है।

कोई समझा सकता है क्यों?

व्याख्या

जैसा कि उत्तरों में बताया गया है: डिफ़ॉल्ट umaskमान और फ़ाइल की अनुमतियों से गणितीय रूप से घटाया नहीं गया है ।

प्रभावी रूप से शामिल ऑपरेशन AND (&) और NOT (!) बूलियन ऑपरेटरों का एक संयोजन है। दिया हुआ:

R = परिणामस्वरूप अनुमतियाँ
D = डिफ़ॉल्ट अनुमतियाँ
U = वर्तमान umask

आर = डी एंड यू

उदाहरण के लिए:

666 और! 0053 = 110 110 110 और 
            ; 000 101 011 
             110 110 110 और  
             111 010 100
           = 110 010 100 = 624 = आरडब्ल्यू - रे--
 
777 और! 0022 = 111 111 111 और 
            ! 000 010 010
             111 111 111 &  
             111 101 101
           = 111 101 101 = 755 = आरएक्सएक्सआर - एक्सआर-एक्स 

टिप

परिणामी अनुमतियों को जल्दी से जानने का एक आसान तरीका (कम से कम इससे मुझे मदद मिली) यह सोचना है कि हम सिर्फ 3 दशमलव मानों का उपयोग कर सकते हैं:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

अनुमतियाँ इन 3 मूल्यों का एक संयोजन होंगी।
" "यह बताने के लिए प्रयोग किया जाता है कि सापेक्ष अनुमति नहीं दी गई है।

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

इसलिए अगर मेरा वर्तमान उमस्क है तो 0053मुझे पता है कि मैं (4+1) समूह से पढ़ने और निष्पादन की अनुमति को हटा रहा हूं और इसके (2+1)परिणामस्वरूप अन्य लेखन और निष्पादन कर रहा हूं

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(समूह और अन्य पहले से ही निष्पादन की अनुमति नहीं थी)

जवाबों:


26

umaskएक मुखौटा है , यह एक घटाया मूल्य नहीं है। इस प्रकार:

  • मोड 666, मास्क 022: परिणाम 666 & ~ 022, अर्थात 666 और 755, जो 644 है;
  • मोड ६६६, मुखौटा ०२१: परिणाम ६६६ और ~ ०२१ है, अर्थात ६६६ और ,५६, जो ६४६ है।

बिट्स शामिल की सोचो। एक मोड में 6 का मतलब बिट्स 1 और 2 सेट, पढ़ना और लिखना है। एक मास्क मास्क 2 में 2, राइट बिट। 1 एक मुखौटा मास्क बिट 0 में, निष्पादित बिट।

इसे दर्शाने का एक और तरीका है, टेक्स्ट फॉर्म में अनुमतियों को देखना। 666 है rw-rw-rw-; 022 है ----w--w-; 021 है ----w---x। मास्क मोड से अपने सेट बिट्स को rw-rw-rw-गिराता है , इसलिए नकाबपोश ----w--w-बन जाता है rw-r--r--, नकाबपोश ----w---xबन जाता है rw-r--rw-


11

आपको बाइनरी में सोचने की ज़रूरत है, दशमलव नहीं। विशेष रूप से, तीन 3-बिट बाइनरी नंबर हैं: मालिक, समूह और अन्य के लिए एक-एक। प्रत्येक का मान 000 से 111 (दशमलव में 4-7) तक है।

जैसे rw-rw-rw (666) 110 110 110 है।

umaskमूल्य एक मुखौटा निर्दिष्ट जब एक नई फ़ाइल या निर्देशिका बनाने जो बिट्स पर या (1 या 0) बंद हो जाएगा। जैसे 022 दशमलव 000 010 010 बाइनरी है, जबकि 021 दशमलव 000 010 001 है

अनुमति बिट अंतिम मान पर पहुंचने के लिए नकारात्मक umask के साथ AND-ed हैं। "उपेक्षित" का अर्थ है कि सभी बिट्स उलटे हैं, अर्थात सभी 1s 0 पर फ़्लिप हो गए हैं, और इसके विपरीत। जैसेNOT 022 (000 010 010) = 755 (111 101 101)

उदाहरण: 666 & !022 = 644। बाइनरी में, यह है:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

इसके अलावा 777 & !022 = 755:

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

ध्यान दें कि प्रत्येक बिट का अंतिम मूल्य केवल 1 ही हो सकता है यदि यह मूल अनुमति मूल्य (666 या 777) और नकारात्मक ऑमस्क दोनों में 1 है । यदि दोनों में से 0 है, तो परिणाम 0. है, अर्थात 1 और 1 = 1 है , जबकि 1 और 0 = 0 है


कड़ाई से बोलना वहाँ सेतु, सेटगिड और चिपचिपा बिट्स के लिए एक चौथा 3-बिट बाइनरी नंबर है। यही कारण है कि आप अक्सर अनुमतियों और मास्क को एक प्रमुख 0 (या 0-4 से कुछ अन्य अग्रणी संख्या) के साथ देखते हैं। जैसे 0777 या 2755।


2
अच्छी तरह से तकनीकी रूप से यह अष्टाधारी है, दशमलव नहीं, लेकिन यह वास्तव में उत्तर के मूल को नहीं बदलता है।
डेविड जेड

@ डेविड: ओपी ने सोचा कि यह दशमलव है (क्यू में घटाव उदाहरण देखें), जो संभवत: क्या संदर्भ को संदर्भित करता था।
ऑर्बिट

1
@ ओपी द्वारा दिए गए घटाव के उदाहरणों को देखें कि क्या वे अष्टक या दशमलव हैं, यह देखते हुए कि कोई अंक 8 तक नहीं पहुंचता है और कैरी की कभी आवश्यकता नहीं होती है। मैं मानता हूं कि यह संभव है कि ओपी दशमलव में सोच रहा था, लेकिन सवाल में कुछ भी साबित नहीं होता है।
स्टीफन किट

@StephenKitt: लगता है कि मेरी उंगली कीपैड पर फिसल गई होगी जब मैं इसे साबित करने के लिए calc.exe में उदाहरण लिख रहा था
ऑर्बिट

1
@cas हां, मैं उस हिस्से से असहमत नहीं था (यह मेरे जवाब का आधार भी है), लाइटनेस के दावे के साथ कि ओपी ऑकल के बजाय दशमलव में गणना कर रहा था।
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.