666 डिफ़ॉल्ट फ़ाइल निर्माण अनुमतियाँ क्यों हैं?


12

जैसा कि मुझे पता चला है, जब umask का उपयोग करते हैं, तो आप फ़ाइलों को दे सकने वाली उच्चतम अनुमतियाँ 666 हैं। यह किसके द्वारा किया जाता है umask 0000। यह डिफ़ॉल्ट फ़ाइल निर्माण अनुमतियों के कारण है, जो कि मेरे द्वारा ज्ञात प्रत्येक प्रणाली पर 666 प्रतीत होती हैं।

मुझे उन फ़ाइलों के लिए पता है जिनकी सामग्री दिखाने के लिए हमें निष्पादन योग्य अधिकारों की आवश्यकता है।
लेकिन हम 666 पर डिफ़ॉल्ट फ़ाइल निर्माण अनुमतियों को सीमित क्यों करते हैं?


ये कैसी व्यवस्था? केवल umaskमेरी मुलाकात हमेशा 0022 हुई, डिफ़ॉल्ट अनुमति 644 बना।
मैनटवर्क

नहीं, आपने गलत समझा। Umask 666 की डिफ़ॉल्ट फ़ाइल अनुमतियों का उपयोग कर रहा है और अपने स्वयं के मूल्य (जो आपके सिस्टम के लिए 0022 है) को प्रतिस्थापित करता है। तो आपके द्वारा निर्धारित की जाने वाली सबसे अधिक अनुमतियाँ हैं umask 0000- जो अभी भी 666 की अनुमतियों को दर्ज करने के लिए सीमित है। (लेकिन स्पष्ट रूप से फ़ोल्डर्स 777 का उपयोग करते हैं)
पीटर

पकड़ लिया। अब यह एक अच्छा सवाल है।
मैनटवर्क

2
फ़ाइल सामग्री देखने के लिए आपको निष्पादन योग्य अनुमति की आवश्यकता नहीं है। यह निर्देशिकाओं के लिए ऐसा है, यही वजह है कि निर्देशिका डिफ़ॉल्ट रूप से निष्पादित अनुमतियों के साथ बनाई जाती हैं।
जोसेफ आर।

1
मेरा मानना ​​है कि [लेकिन यह सुनिश्चित करने के लिए और अधिक देखने की आवश्यकता होगी] कि यह डिजाइन द्वारा है, कुछ सुरक्षा समस्याओं से बचने के लिए: "चामोद" तक पहुंच के बिना, आप एक फ़ाइल निष्पादन योग्य नहीं बना सकते। umask 0000 0766 के साथ 0666 और निर्देशिकाओं के साथ फाइलें बनाता है [जो, वैसे, काफी भयानक डिफ़ॉल्ट सेटिंग, सुरक्षा वार है!]
ओलिवियर डुलैक

जवाबों:


10

जहां तक ​​मैं बता सकता हूं, यह मानक उपयोगिताओं में कठिन-कोडित है। मैं straceदोनों एक d touchएक नई फ़ाइल बनाने और mkdirएक नया निर्देशिका बनाने।

touchट्रेस इस उत्पादित:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

जबकि mkdirट्रेस ने इसका उत्पादन किया:

mkdir("newdir", 0777)                   = 0

सी में फ़ाइल / निर्देशिका निर्माण प्रक्रिया को कोडिंग करने का छोटा, मुझे डिफ़ॉल्ट अनुमतियों को संशोधित करने का एक तरीका नहीं दिखता है। हालांकि, यह मुझे लगता है कि डिफ़ॉल्ट रूप से फ़ाइलों को निष्पादन योग्य नहीं बनाने से समझ में आता है: आप नहीं चाहते हैं कि किसी भी यादृच्छिक पाठ को गलती से शेल कमांड के रूप में गलत समझा जाए।

अपडेट करें

आपको अनुमति देने के लिए एक उदाहरण है कि कैसे अनुमति बिट्स मानक उपयोगिताओं में हार्ड-कोडित हैं। coreutilsपैकेज में दो फ़ाइलों से कुछ प्रासंगिक लाइनें हैं जिसमें दोनों के लिए स्रोत कोड शामिल है touch(1)और mkdir(1)दूसरों के बीच:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

दूसरे शब्दों में, यदि मोड निर्दिष्ट नहीं है, तो इसे S_IRWXUGO(पढ़ें: 0777) द्वारा संशोधित करें umask_value

touch.c और भी स्पष्ट है:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

यही है, सभी को पढ़ने और लिखने की अनुमति दें (पढ़ें: 0666), जो निश्चित रूप से umaskफ़ाइल निर्माण पर प्रक्रिया द्वारा संशोधित किया जाएगा ।

आप केवल इस प्रोग्राम के आसपास ही प्राप्त कर सकते हैं: यानी या तो एक सी प्रोग्राम के भीतर से फाइल बनाते समय, जहाँ आप सिस्टम कॉल सीधे या किसी भाषा के भीतर से करते हैं जो आपको एक निम्न-स्तरीय syscall बनाने की अनुमति देता है (उदाहरण के लिए देखें पर्ल के sysopenतहत) perldoc -f sysopen)।


आप सही हैं, मुझे कोई दुर्घटना नहीं चाहिए। लेकिन इसे बदलने का कोई रास्ता नहीं है, भयानक है! मानक मान 777 होना चाहिए । और हमें जरूरत है umask fileऔर umask dirदो अलग-अलग डिफ़ॉल्ट मान और ठीक सेट करें। लेकिन अब मेरे पास निष्पादन परमिट के साथ फाइल बनाने का कोई तरीका नहीं है।
पीटर

1
@PeterI खैर, mkdir(1)आपको -mसृजन के समय में निर्देशिका के मोड को निर्दिष्ट करने के लिए एक स्विच प्रदान करता है । फ़ाइलों के साथ, हालाँकि, चूंकि फ़ाइल निर्माण open(2)syscall का उपयोग करता है, इसलिए फ़ाइल बनाने के लिए आप जिस टूल का उपयोग करते हैं, वह वह है जो मोड बिट्स को पास करने के लिए ज़िम्मेदार है openऔर आपको इस मामले में कहने की ज़रूरत नहीं है। install(1)डिफ़ॉल्ट रूप से आपकी फ़ाइल को एक नए स्थान पर कॉपी करता है और निष्पादित बिट्स सेट करता है, लेकिन यह अभी भी सृजन के समय पर नहीं हो रहा है।
जोसेफ आर।

आप जो कह रहे हैं, touchउदाहरण के लिए सही मान सेट करने के लिए जिम्मेदार है। क्या आप जानते हैं कि यह मूल्यों को कहाँ संग्रहीत करता है? शायद वे सिस्टमवाइड सेट हैं - इसलिए हम उन्हें बदल सकते हैं? क्योंकि मैं मुक्त तोड़ना चाहता हूँ ;)
पीटर

@PeterI अद्यतन उत्तर देखें।
जोसेफ आर।

1
@PeterI मैंने फिर से जवाब अपडेट किया। हो सकता है कि आप सी या सीधे किसी अन्य भाषा के भीतर से पर्ल को बनाने में सक्षम हों जैसे पर्ल।
जोसेफ आर।

6

सबसे पहले, कोई वैश्विक डिफ़ॉल्ट नहीं है, अनुमतियाँ फ़ाइल बनाने वाले एप्लिकेशन पर निर्भर करती हैं। उदाहरण के लिए, यह छोटा सी प्रोग्राम अनुमतियों के साथ एक फ़ाइल '/ tmp / foo' बनाएगा 0777 अगर umask 0000 है (किसी भी स्थिति में अनुमतियाँ 0777 और ~ umask होंगी):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

कहा जा रहा है कि, कई एप्लिकेशन 0666 की अनुमतियों के साथ फाइल बनाते हैं। इसके दो कारण हैं:

  1. सुरक्षा: आप नहीं चाहते कि कोई भी मनमानी फ़ाइल निष्पादन योग्य हो।
  2. सुविधा: अधिकांश फ़ाइलों को निष्पादन योग्य होने की आवश्यकता नहीं है। निष्पादन योग्य बिट को चुनिंदा कुछ फ़ाइलों पर सेट करना आसान है, ताकि अन्य फ़ाइलों की भारी मात्रा पर इसे अनसेट किया जा सके। बेशक, umask 0133 इसे हल करेगा, लेकिन फिर कुछ भी नहीं जीता जाता है और आप प्रोग्राम को निष्पादन योग्य फ़ाइलों को बनाने नहीं दे सकते हैं, भले ही आप चाहते थे।

1
सुरक्षा कारणों से x (निष्पादित) बिट सेट के बिना फाइलें बनाई जाती हैं। फ़ाइलों के अनजाने निष्पादन [cw] ould एक "बैड थिंग" (tm) हो। Chmod प्रोग्राम आपको जरूरत के अनुसार अनुमतियों के सेट (पुनः) की क्षमता देता है।
ChuckCottrill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.