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


93

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

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

file3file3सिस्टम पर कहीं और एक लिंक है।

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

/tmp/file3 -> /directory/file3

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


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

जवाबों:


90

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

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

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

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

-h यदि फ़ाइल एक प्रतीकात्मक लिंक है, तो लिंक को इंगित करने वाली फ़ाइल के बजाय लिंक के मोड को स्वयं बदलें।

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

यदि पहले मामले में आप 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

2
यह मेरे लिए भी आश्चर्य की बात थी। अगला प्रश्न: सिम्लिंक पर अनुमतियाँ कौन करता है ?
एडवर्ड फाल

@EdwardFalk सिमिलिंक अनुमतियाँ गैर-प्रतिबंधक नहीं हैं क्योंकि लिंक की गई फ़ाइल से अनुमतियाँ प्राप्त करने के लिए सब कुछ आवश्यक है।
वाल्फ

5

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

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

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

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

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

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

दूसरी ओर, MacOS POSIX को थोड़ा तोड़ देता है। हालांकि एक प्रतीकात्मक लिंक का पालन इसकी पठन अनुमति के बावजूद किया जा सकता है, यदि उपयोगकर्ता की पठन अनुमति नहीं है तो (अनुमति अस्वीकृत) के 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।)

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


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

3
यह प्रश्न का उत्तर कैसे देता है?
jww
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.