प्रतीकात्मक लिंक के लिए अनुमतियाँ बदलें


37

मेरे पास इन अनुमतियों के साथ एक सहानुभूति है:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

सिमिलर एक .tar.gz आर्काइव में स्थित है। अब जब मैं tar.gz आर्काइव को अनपैक कर देता हूं तो सिवलिंक मावेन का उपयोग करके मान्य नहीं रह जाता है। इसलिए मैं सिमलिंक को फिर से बनाने की कोशिश कर रहा हूं। पहले मैं ln का उपयोग करके सिमलिंक बनाता हूं, लेकिन मैं मूल सिमिलिंक के समान अनुमतियाँ कैसे सेट करूं?

जवाबों:


59

आप एक नया सिमलिंक बना सकते हैं और इसे पुराने लिंक के स्थान पर ले जा सकते हैं।

ln -s <new_location> npm2
mv -f npm2 npm

यह लिंक स्वामित्व को संरक्षित करेगा। वैकल्पिक रूप से, आप chownलिंक के स्वामित्व को मैन्युअल रूप से सेट करने के लिए उपयोग कर सकते हैं ।

chown -h myuser:myuser npm

अधिकांश सिस्टमों पर, सिमलिंक अनुमतियाँ कोई मायने नहीं रखती हैं। सिम्लिंक का उपयोग करते समय, सिम्लिंक के लक्ष्य के घटकों की अनुमति की जाँच की जाएगी। हालांकि, कुछ प्रणालियों पर वे मायने रखते हैं। MacOS के लिए लिंक पर रीड की अनुमति की आवश्यकता होती है readlink, और NetBSD के sympermमाउंट ऑप्शन लिंक अनुमतियों की जांच को रीड और ट्रैवर्सल पर लागू करता है। उन प्रणालियों (और उनके रिश्तेदारों, जिनमें FreeBSD और OpenBSD शामिल हैं) पर एक समान -hविकल्प है chmod

chmod -h 777 npm

1
मैं सिर्फ एक CentOS 6.8 सर्वर पर सहानुभूति के साथ एक अनुमति समस्या में भाग गया। सिमिलिंक के मालिक थे: जड़ का समूह: जड़। जब मालिक और समूह को उस निर्देशिका के उपयोगकर्ता के रूप में बदल दिया गया था, जिसमें वे इस उत्तर में दिखाए गए थे, तो अनुमति समस्या दूर हो गई।
रात उल्लू

बस एक स्पष्टीकरण प्रदान करना। सिम्लिंक पर स्वामित्व या अधिकार बदलने के लिए, -h ध्वज डेरेफ़र्ड फ़ाइल के बजाय सिम्लिंक फ़ाइल को प्रभावित करेगा।
अल्टिमावेपॉन

12

जब आप chmodलिंक की अनुमतियों को सेट करने के लिए उपयोग करने की कोशिश करते हैं , तो वास्तव में आप लिंक के लक्ष्य की अनुमतियों को सेट करने के लिए करते हैं। लिंक की अनुमतियां अर्थहीन हैं।


2
यदि कोई दुर्भावनापूर्ण कोड का लिंक बदल दे तो क्या होगा? मूल कोड भी कुछ हो सकता है जो रूट केवल एक्सेस कर सकता है। उदाहरण के लिए क्रॉस्टैप स्क्रिप्ट में।
एलिकांडिल

@aliqandil आम तौर पर एक उपयोगकर्ता किसी भी फ़ाइल को उस निर्देशिका में हटा सकता है और पुन: निर्मित कर सकता है जिसके लिए उनके पास पहुंच है। Bash में, एक फाइल के testसाथ -rw-rw-r-- root root, जिसके लिए rm testमुझे प्रॉम्प्ट प्राप्त होता है rm: remove write-protected regular empty file 'test'?समाधान है निर्देशिकाओं में संवेदनशील फ़ाइलों को रखने के लिए जिनके लिए उपयोगकर्ताओं के पास केवल-पढ़ने के लिए एक्सेस है।
एकोसेक्सुअल कैशे

5

जब आपके पास एक लिंक हो जैसे:

link -> foo/bar

और इसे बदलना चाहते हैं:

link -> new/target

विचार करने के लिए दो मामले हैं:

  1. foo/barएक निर्देशिका नहीं है या मौजूद नहीं है या आपके पास खोज का उपयोग नहीं है foo। फिर

    ln -s new/target link
    

    विफल हो जाएगा क्योंकि linkपहले से ही मौजूद है, लेकिन आप मानक का उपयोग करके इसे दूर कर सकते हैं:

    ln -fs new/target link
    
  2. foo/barएक निर्देशिका है (और आप एक निर्देशिका fooहै foo/barयह निर्धारित करने में सक्षम होने के लिए खोज अनुमति है )। उस मामले में, जब आप करते हैं:

    ln -s new/target link
    

    या

    ln -fs new/target link
    

    targetइसे linkडायरेक्टरी के अंदर एक नया सिम्लिंक बनाने के रूप में समझा जाता है ( linkयह एक डायरेक्टरी है क्योंकि यह डायरेक्टरी के लिए सिम्लिंक है foo/bar)। तो आप वास्तव में एक बनाएँगे:

    foo/bar/target -> new/target
    

    कि दूर करने, जीएनयू lnएक है -Tलिंक नाम के लिए विकल्प हमेशा लिंक नाम के रूप में विचार किया जाना है, और इसलिए में लिंक (रों) बनाने के लिए एक निर्देशिका के रूप में नहीं, जीएनयू साथ। ln:

    ln -fsT new/target link
    

    काम करेगा। पहले की तरह, यह मूल linkसीमलिंक को हटा देगा और इसे new/targetलक्ष्य के रूप में नए सिरे से बनाएगा (और मालिक के रूप में 'यूरोपिड और एगिड' प्रक्रिया)।

    जीएनयू के पास lnभी एक -nविकल्प है। यह तब काम करता है -Tजब linkवास्तव में एक वास्तविक निर्देशिका को छोड़कर वह उस निर्देशिका के अंदर सहानुभूति पैदा करेगा (एक त्रुटि के साथ असफल होने के बजाय)।

    संभवतः, आपका सबसे अच्छा विकल्प लिंक को पहले हटाना है और फिर इसे फिर से बनाना है:

    rm -f link && ln -s new/target link
    

अधिकांश सिस्टमों पर, सहानुभूति पर अनुमतियों को अनदेखा किया जाता है और आम तौर पर तय किया जाता है rwxrwxrwx

सिस्टम पर जहां सिमलिंक की अनुमति मायने रखती है (जैसे ओएस / एक्स जहां आपको अपने लक्ष्य को हल करने में सक्षम होने के लिए सिम्क्लिन के लिए पठन अनुमति की आवश्यकता होती है), आमतौर chmod -hपर उन्हें ( ओएस / एक्स पर) बदलने का एक तरीका है ।

स्वामित्व, जबकि ऊपर की तरह ज्यादातर सिस्टम पर सिमलिंक द्वारा बताई गई फ़ाइल तक पहुंच के लिए प्रासंगिक नहीं है, कुछ अन्य प्रासंगिकता tमूल माता-पिता या कोटा के बिट हो सकता है ... ) और इसे बदलने के लिए एक मानक आदेश है:

chown -h user[:group] the-link
chgrp -h group the-link

0

यदि आपको सहानुभूति अनुमति बदलने की आवश्यकता है (आमतौर पर अर्थहीन, जैसा कि अन्य उत्तरों में लिखा गया है), तो मैं निम्नलिखित -Rविकल्प का उपयोग करके सफल रहा था chown:

chown -R myuser:mygroup link

यदि -Rउपयोग नहीं किया गया था, तो अनुमतियाँ नहीं बदली गईं।


यह GNU के साथ काम करेगा chownक्योंकि वहाँ -Rनिहित -Pहै, हालांकि यह गारंटी नहीं है और कुछ अन्य चेंज कार्यान्वयन में काम नहीं करेगा। सिमलिंक स्वामित्व को बदलने का मानक तरीका -hविकल्प के साथ है । मैंने अभी स्वीकृत उत्तर को अपडेट किया है जो गलत था।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.