एक गैर-रिक्त निर्देशिका को कैसे निकालना है जो लिनक्स में उपयोगकर्ता के स्वामित्व में नहीं है?


10

यदि एक निर्देशिका "फू" उपयोगकर्ता ए के स्वामित्व में है और इसमें एक निर्देशिका "बार" है, जो रूट के स्वामित्व में है, तो उपयोगकर्ता ए केवल इसे हटा सकता है rmdir, जो तार्किक है, क्योंकि "ए" फू उपयोगकर्ता ए द्वारा लिखने योग्य है।

लेकिन अगर निर्देशिका "बार" में एक और रूट-स्वामित्व वाली फ़ाइल है, तो निर्देशिका को हटाया नहीं जा सकता है, क्योंकि इसमें मौजूद फ़ाइलों को पहले हटाया जाना चाहिए, इसलिए यह खाली हो जाती है। लेकिन "बार" स्वयं ही लिखने योग्य नहीं है, इसलिए इसमें फ़ाइलों को निकालना संभव नहीं है।

क्या इसके आसपास कोई रास्ता है? या, मुझे मनाओ अन्यथा यह क्यों आवश्यक है।

जवाबों:


7

व्याख्या 1: एक निर्देशिका फाइलसिस्टम का एक उप-समूह है। इसमें उपनिर्देशिका बनाकर इसे उप-विभाजनों में विभाजित किया जा सकता है। निर्देशिका के मालिक fooउपस्पेस अंदर सब कुछ पर नियंत्रण होना चाहिए: foo/bar, foo/bar/qux, आदि

व्याख्या 2: एक निर्देशिका फाइलसिस्टम का एक उप-समूह है। हर निर्देशिका किसी न किसी निर्देशिका से जुड़ी होती है, जिसे उसका जनक कहा जाता है। निर्देशिका के मालिक के fooपास सबस्पा के अंदर सब कुछ पर नियंत्रण है; हालाँकि, एक उपनिर्देशिका के लिए foo/bar, मालिक का fooइस पर नियंत्रण होता है कि क्या barसंलग्न किया जा सकता है, fooलेकिन अंदर क्या जाता है , इस पर नियंत्रण नहीं है bar: केवल उस barपर नियंत्रण का मालिक है।

व्याख्या 2 के पक्ष में साक्ष्य: जैसा कि आपने नोट किया है, जिस तरह से अनुमतियाँ काम करती हैं। इसके अलावा, तथ्य यह है कि कुछ यूनिक्स फाइल सिस्टम एक निर्देशिका को एक से अधिक अभिभावकों के साथ संलग्न करने की अनुमति देते हैं: इसे कई हार्ड लिंक कहा जाता है। (नियमित फ़ाइलों के लिए कई हार्ड लिंक आम है, लेकिन आमतौर पर यह हतोत्साहित या निर्देशिका के लिए निषिद्ध है क्योंकि मुख्य रूप से लूप बनाने का जोखिम होता है, जहां एक निर्देशिका अपने स्वयं के दादा दादी का एन बार हटा दिया जाता है - इसलिए आप इसे रूट से प्राप्त नहीं कर सकते हैं निर्देशिका, जो एक बहुत ही सामान्य अपेक्षा है। अगर किसी निर्देशिका में 0 हार्ड लिंक हैं, तो भी क्या करना है इसकी समस्या है, लेकिन खाली नहीं है: चूंकि निर्देशिका अनासक्त है, आप इसे हटाना चाहते हैं, लेकिन आप इसके साथ क्या करते हैं सामग्री?)

व्याख्या 1 के पक्ष में साक्ष्य: व्यवहार में, निर्देशिका में एक ही माता-पिता होते हैं और इसलिए एक पेड़ की संरचना होती है। और आप foo/bar/quxतब तक एक्सेस नहीं कर सकते जब तक कि आपने अनुमति (साथ fooही) को निष्पादित न कर दिया हो bar, (सिवाय इसके कि कुछ अस्पष्ट तरीके हैं, barबिना पहुंच के दिए जाने के तरीके foo)। तो ऊपरी स्तर मायने रखते हैं।

अधिक व्यावहारिक नोट पर, आपकी स्थिति में, उपयोगकर्ता A कर सकता है

mkdir कचरा
एमवी फू / बार कचरा /
rmdir फू

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

यह एक अच्छी व्याख्या है, लेकिन इस mvमुद्दे को दरकिनार करने के लिए अंत में उदाहरण रास्पियन पर मेरे लिए काम नहीं करता है (किसी अन्य सिस्टम पर कोशिश नहीं की गई है)। इसके अलावा, इस मुद्दे पर शोध करने के बाद, मैंने mvकहीं और उल्लिखित समाधान के उपयोग को नहीं देखा है। वास्तव में, मेरी समझ के आधार पर कि अनुमतियाँ कैसे काम करती हैं, यह समझ में आता है कि mvजब मैंने यह प्रयास किया था तो असफल हो गया था। क्या मैं कुछ भूल रहा हूँ? या क्या यह कार्यक्षमता शायद बदल गई है? @ गिल्स @PaHooper
fvgs

@fvgs कुछ भी नहीं बदला है, लेकिन आपकी स्थिति इस एक से अलग अनुमति हो सकती है। मेरा सुझाव है कि आप सर्वर फॉल्ट के बजाय एक नया प्रश्न ( यूनिक्स और लिनक्स पर) पूछें क्योंकि यह प्रश्न शायद ऑफ-टॉपिक माना जाएगा यदि इसे अब एसएफ पर पूछा गया) और अपनी स्थिति के सभी विवरण दें।
गाइल्स का SO- बुराई से दूर रहना '

@ क्या आप कृपया मुझे कुछ प्रलेखन, संदर्भ, या आपके द्वारा वर्णित व्यवहार का उल्लेख कर सकते हैं mv? मैं mvबार निर्देशिका का नाम बदलने के लिए उपयोग करने में सक्षम हूं । मतलब कि mvजब तक मैं वर्तमान निर्देशिका के बाहर या किसी अन्य निर्देशिका में बार को स्थानांतरित करने का प्रयास नहीं करता तब तक सफल होता है। लेकिन आपके द्वारा दिया गया उदाहरण (जो एक निर्देशिका को आगे बढ़ाता है) मेरे लिए काम नहीं करता (अनुमति अस्वीकृत)। क्या आपने जो उदाहरण दिया है, वह प्रश्न में निर्दिष्ट विशिष्ट स्थितियों के अलावा है?
fvgs

@fvgs मेरा उदाहरण barएक निर्देशिका को स्थानांतरित नहीं करता है , यह इसे एक निर्देशिका में स्थानांतरित करता है जो आपके पास है। garbageएक ही फाइल सिस्टम पर कहीं भी हो सकता है, जरूरी नहीं कि एक भाई-बहन हो foo
गिल्स एसओ- बुराई को रोकना '

0

इसके चारों ओर एकमात्र तरीका मूल निर्देशिका पर सेटगाइड या सेतु का उपयोग करना या एसीएल का उपयोग करना होगा।

निर्देशिका सेटगिड के साथ सेट करें

chmod g+s foo

इसके साथ एक डिफ़ॉल्ट ACL सेट करें

setfacl -d -R -m g:group:rwx foo

यह इसे इस पथ पर डिफ़ॉल्ट ACL के रूप में सेट करता है। आपको फ़ाइल सिस्टम को माउंट करना होगा जिसमें यह विकल्प acl विकल्प के साथ हो!

अब मुझे बताइए कि आप ऐसा क्यों सोचते हैं।


खैर, समस्या एक संगति की है। मेरे द्वारा निर्देशिका में किसी अन्य उपयोगकर्ता के स्वामित्व वाली फ़ाइल या खाली निर्देशिका को हटाने से मुझे कुछ भी नहीं रोकता है, लेकिन यदि यह खाली नहीं है, तो मैं अपनी निर्देशिका को हटाने से बंद हूं।
एलेक्स बी

अगर ऐसा है, तो मैं आपके द्वारा दिए गए विकल्पों में से एक का उपयोग करूँगा। वे आपके लिए ठीक काम करेंगे।
9

मैं अक्सर अपने डेस्कटॉप पर कई खातों का उपयोग करता हूं (जिनमें से एक "मुख्य गैर-रूट" खाता है)। मैं ऐसी स्थिति भी प्राप्त कर सकता हूं जब make installजड़ से शुरू होकर कुछ का निर्माण शुरू होता है।
वि।

मूल निर्देशिका पर सेटिड मदद नहीं करता है। रूट के रूप में किए जाने के बाद cd ~user && mkdir qqq && touch qqq/qqqमैं उपयोगकर्ता से qqq से छुटकारा नहीं पा सकता हूं chmod g+s .और rm -Rf qqq
वि।

Mmh। यह शायद एक umask मामला है। यदि आपकी निर्देशिका 775 है, तो यह सेटगिड है और आपका ऑमस्क 0002 है, तो फाइलें समूह के लिए उपयुक्त हैं और इसलिए आपके लिए हटाने योग्य हैं। लेकिन, सच है, यह umask 0022 (जो ज्यादातर डिफ़ॉल्ट है) के साथ काम नहीं करता है। कहना चाहिए था कि क्या आपने acl विकल्प का परीक्षण किया है?
जूना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.