सवाल सिमलिंक पर फ़ाइल अनुमतियां कैसे लागू होती हैं?


मान लें कि आपके पास यह संरचना है:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3 दूसरे के लिए एक लिंक है file3 सिस्टम पर कहीं और।

अब मैं कहता हूं chmod 777 निर्देशिका और इसके अंदर सभी सामग्री। क्या मेरा file3 में /tmp उन अनुमतियां प्राप्त करें? साथ ही, मान लें कि हमारे पास एक ही स्थिति है लेकिन उलट है।

/tmp/file3 -> /directory/file3

अगर मैं फाइल से जुड़ी अनुमतियों को लागू करता हूं, तो यह लिंक को कैसे प्रभावित करता है?


81
2018-06-27 20:42


मूल


अनुमतियां केवल फाइल को प्रभावित करती हैं, सिम्लिंक नहीं। - baraboom


जवाब:


यह इस बात पर निर्भर करता है कि आप कैसे कॉल करते हैं chmod और जिस मंच पर आप चल रहे हैं।

उदाहरण के लिए, एक लिनक्स सिस्टम पर, man chmod यह कहता है:

chmod  प्रतीकात्मक लिंक की अनुमतियों को कभी नहीं बदलता; chmod   सिस्टम कॉल उनकी अनुमतियों को बदल नहीं सकता है। ये कोई समस्या नहीं है   चूंकि प्रतीकात्मक लिंक की अनुमतियों का कभी भी उपयोग नहीं किया जाता है। हालाँकि,   कमांड लाइन पर सूचीबद्ध प्रत्येक प्रतीकात्मक लिंक के लिए, chmod बदलता है   पॉइंट-टू फ़ाइल की अनुमतियां। इसके विपरीत, chmod ध्यान न दी   प्रतीकात्मक लिंक रिकर्सिव निर्देशिका ट्रैवर्सल के दौरान सामना किया।

हालांकि, मैक पर, chmod का उपयोग इस तरह के विकल्पों का उपयोग करके प्रतीकात्मक लिंक की अनुमतियों को संशोधित करने के लिए किया जा सकता है man chmod):

-एच अगर फ़ाइल एक प्रतीकात्मक लिंक है, तो लिंक के मोड को बदलें   लिंक की ओर इशारा करते हुए फ़ाइल की बजाय खुद को।

उदाहरण के लिए, मान लें कि आप इस शेष उत्तर के लिए लिनक्स मशीन पर हैं।

यदि आप पहले मामले में भागते हैं chmod -R 777 directory अनुमतियों को दोबारा बदलने के लिए, लिंक लक्ष्य प्रभावित नहीं होगा, लेकिन यदि आप करते हैं chmod 777 directory/*, यह।

यदि आप सीधे लिंक लक्ष्य पर अनुमतियां बदलते हैं, तो उन अनुमतियों को पूरा किया जाएगा (चूंकि मैन पेज और baraboom कहें, वास्तविक लिंक अनुमतियों का उपयोग किसी भी चीज़ के लिए नहीं किया जाता है)।


चित्रण के लिए टेस्ट लॉग:

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

81
2018-06-27 21:23



यह भी मेरे लिए एक आश्चर्य था। अगला प्रश्न: सिम्लिंक पर अनुमति कौन करता है मतलब? - Edward Falk
@EdwardFalk symlink अनुमतियां गैर-प्रतिबंधित नहीं हैं क्योंकि सब कुछ लिंक किए गए फ़ाइल से अनुमति प्राप्त करने के लिए इसे पार करने में सक्षम होना चाहिए। - Walf


बारबूम और पेथ के उत्तर दोनों सही हैं: प्रतीकात्मक लिंक पर अनुमति बिट्स अप्रासंगिक हैं (मैकोज़ को छोड़कर; नीचे देखें), और एक प्रतीकात्मक लिंक पर अनुमति बदलना - द्वारा chmod कमांड लाइन उपकरण या द्वारा chmod() सिस्टम कॉल - बस कार्य करेगा जैसे कि यह प्रतीकात्मक लिंक के लक्ष्य के खिलाफ किया गया था।

उद्धरण के लिए SUSV4 / POSIX.1-2008 symlink () सिस्टम कॉल का विवरण:

बनाए गए प्रतीकात्मक लिंक के लिए फ़ाइल मोड बिट्स के मान निर्दिष्ट नहीं हैं। POSIX.1-2008 द्वारा निर्दिष्ट सभी इंटरफेस इस तरह व्यवहार करेंगे जैसे प्रतीकात्मक लिंक की सामग्री हमेशा पढ़ी जा सकती है, सिवाय इसके कि फ़ाइल मोड बिट्स का मान वापस लौटाया गया है st_mode के क्षेत्र स्टेट संरचना निर्दिष्ट नहीं है।

यहां, "अनिर्दिष्ट" प्रत्येक कार्यान्वयन के लिए व्याख्या के कमरे छोड़ देता है। सुनिश्चित वर्णन:

  • लिनक्स पर (ext4fs का उपयोग करके परीक्षण किया गया) stat() रिटर्न st_mode=0777इससे कोई फर्क नहीं पड़ता कि सिमलिंक बनाया गया था जब उमास्क था; ls -l इसलिए हमेशा प्रदर्शित करता है lrwxrwxrwx प्रतीकात्मक लिंक के लिए।
  • मैकोज़ (एचएफएस) और फ्रीबीएसडी (दोनों यूएफएस और जेएफएस) पर, एक प्रतीकात्मक लिंक की अपनी अनुमति होती है: द chmod -h उपरोक्त नोट किया गया आदेश इस लिंक अनुमति को बदल सकता है (जो आंतरिक रूप से गैर-पॉज़िक्स का उपयोग करता है lchown()इसे प्राप्त करने के लिए सिस्टम कॉल), और stat() सिस्टम कॉल के लिए यह मान देता है st_mode

लिनक्स और फ्रीबीएसडी पर प्रतीकात्मक लिंक हमेशा पीछा किया जा सकता है, जैसा कि पॉज़िक्स द्वारा निर्दिष्ट किया गया है। विशेष रूप से, फ्रीबीएसडी पर, इसका मतलब है कि एक प्रतीकात्मक लिंक के फ़ाइल मोड पर नियंत्रण नियंत्रण पर कोई प्रभाव नहीं पड़ता है।

दूसरी तरफ, मैकोज़ थोड़ा पॉज़िक्स तोड़ता है। यद्यपि इसकी पढ़ने की अनुमति के बावजूद एक प्रतीकात्मक लिंक का पालन किया जा सकता है, readlink() के साथ विफल रहता है EACCES (अनुमति अस्वीकृत) यदि उपयोगकर्ता को पढ़ने की अनुमति नहीं है:

$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r--  1 root  staff  1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink

ls: symlink: Permission denied
l---------  1 root  staff  1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye

(ध्यान दें कि -> target दूसरे से आउटपुट में हिस्सा गुम है ls -l आदेश, और वह cat symlink अभी भी सफल और मुद्रित सामग्री की मुद्रित target फ़ाइल को भले ही उपयोगकर्ता को पढ़ने की अनुमति न हो symlink।)

नेटबीएसडी स्पष्ट रूप से नामित एक विशेष माउंट विकल्प प्रदान करता है symperm जो, यदि सेट किया गया है, तो प्रतीकात्मक लिंक को नियंत्रित करने के लिए अनुमतियों को पढ़ने / निष्पादित करने का कारण बनता है readlink() और लिंक ट्रैवर्सल।


2
2018-03-14 20:32





  1. लिंक फ़ाइल ड्रॉप करें (यह सुनिश्चित करने के बाद कि किसी भी प्रक्रिया द्वारा इसका उपयोग नहीं किया जाता है)
  2. umask को इस तरह से सेट करें कि 777-umask = आवश्यक फ़ाइल अनुमतियां
  3. लिंक फ़ाइल को दोबारा बनाएं

-2
2017-10-02 05:48



यह सवाल का जवाब कैसे देता है? - jww