Rm केवल-पढ़ने के लिए फ़ाइलें क्यों निकाल सकता है?


91

यदि मैं एक फ़ाइल बनाता हूं और फिर इसकी अनुमतियों को 444(केवल पढ़ने के लिए ) बदल देता हूं, तो rmइसे कैसे निकाल सकते हैं?

अगर मैं ऐसा करता हूं:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmपूछेंगे कि क्या मैं लिखना-संरक्षित फ़ाइल को निकालना चाहता हूं test.txt। मुझे उम्मीद होगी कि मैं rmइस तरह की फाइल को हटा नहीं सकता और मुझे chmod +w test.txtपहले ऐसा करना होगा । अगर मैं ऐसा rm -f test.txtतो rm, यहां तक कि बिना पूछे फ़ाइल निकाल देंगे, भले ही यह केवल पढ़ने के लिए है।

क्या कोई स्पष्ट कर सकता है? मैं Ubuntu 12.04 / bash का उपयोग कर रहा हूं।


स्पष्टता: मैं इन कमांड को अपने नियमित उपयोगकर्ता के रूप में चला रहा हूं, रूट के रूप में नहीं।
मैग्नस

जवाबों:


104

सभी rmजरूरतों को मूल निर्देशिका पर अनुमति लिखना + निष्पादित करना है। फ़ाइल की अनुमतियाँ ही अप्रासंगिक हैं।

यहाँ एक संदर्भ है जो अनुमतियों के मॉडल को स्पष्ट रूप से समझाता है जितना कि मैं कभी भी कर सकता हूं:

फ़ाइल के डेटा तक पहुंचने के किसी भी प्रयास के लिए पढ़ने की अनुमति की आवश्यकता होती है। फ़ाइल के डेटा को संशोधित करने के किसी भी प्रयास के लिए लिखित अनुमति की आवश्यकता होती है। किसी फ़ाइल (प्रोग्राम या स्क्रिप्ट) को निष्पादित करने के किसी भी प्रयास के लिए निष्पादन की अनुमति की आवश्यकता होती है ...

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

एक निर्देशिका पर एक्सट्यूट अनुमति की आवश्यकता है ताकि वह इसमें सीडी कर सके (यानी, कुछ निर्देशिका को आपकी वर्तमान कार्यशील निर्देशिका बनाने के लिए)।

फ़ाइलों की "इनकोड" जानकारी तक पहुंचने के लिए निर्देशिका पर निष्पादन की आवश्यकता है। आपको फ़ाइलों के इनोड्स को पढ़ने के लिए निर्देशिका खोजने के लिए इसकी आवश्यकता है। इस कारण से किसी निर्देशिका पर निष्पादित अनुमति को अक्सर इसके बजाय खोज अनुमति कहा जाता है।


2
इसलिए अगर मैं एक ऐसी निर्देशिका बनाना चाहता था जहाँ कुछ फाइलें पहले बिना चोदे डिलीट / चेंज नहीं की जा सकती थीं, लेकिन दूसरों को स्वतंत्र रूप से लिखने योग्य बनाया जा सकता है, तो यह असंभव होगा? मुझे 555 डायरेक्टरी को चोदना होगा, जिसका मतलब है कि डायरेक्टरी की कोई भी फाइल बनाई या संशोधित नहीं की जा सकती है।
मैग्नस

3
@ मैग्नस - बेशक, आपको केवल पढ़ने योग्य निर्देशिका के अंदर एक लिखने योग्य बच्चे की निर्देशिका बनाने से रोकना नहीं है, और उसके अंदर अपनी लेखन योग्य फ़ाइलों को संग्रहीत करना है। बाल निर्देशिका को स्वयं हटाया नहीं जा सकता, लेकिन इसकी सामग्री हो सकती है।
ire_and_curses

7
क्या आप किसी निर्देशिका को +tइतना चिपचिपा नहीं बना सकते हैं कि लोग उस निर्देशिका में फ़ाइलों को संशोधित या हटा नहीं सकें, भले ही वे निर्देशिका तक पहुंच लिखने के बावजूद खुद के पास न हों?
शादुर

3
@ मैग्नस यदि आपकी रूट एक्सेस (सुडो सहित) है, तो आप chattrफ़ाइलों में अपरिवर्तनीय ध्वज जोड़ने के लिए उपयोग कर सकते हैं । यदि नहीं, तो ire_and_curses काफी सही है।
जेम्स ओ'गोरमैन

6
Rm -f का उपयोग न करने से जब तक मैं शांत रहता हूं, तब तक काम करता है ... इसके अलावा, मुझे नहीं पता कि मैं लिखी गई मंदबुद्धि बैश स्क्रिप्ट क्या कर सकता हूं या नहीं कर सकता हूं
Magnus

53

ठीक है, आपकी टिप्पणी के अनुसार ire_and_curses, जो आप वास्तव में करना चाहते हैं, वह कुछ फ़ाइलों को अपरिवर्तनीय बनाता है। आप chattrकमांड के साथ ऐसा कर सकते हैं । उदाहरण के लिए:

जैसे

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

आप एक अपरिवर्तनीय फ़ाइल के लिए कुछ भी नहीं कर सकते हैं - आप इसे हटा नहीं सकते हैं, इसे संपादित कर सकते हैं, इसे अधिलेखित कर सकते हैं, इसका नाम बदल सकते हैं, इसे चोद सकते हैं या इसे चुन सकते हैं, या कुछ भी कर सकते हैं। केवल एक चीज जिसे आप कर सकते हैं वह है इसे पढ़ें (यदि यूनिक्स अनुमतियाँ अनुमति दें) और (रूट के रूप में) chattr -iअपरिवर्तनीय बिट को हटाने के लिए।

सभी फाइलसिस्टम सभी विशेषताओं का समर्थन नहीं करते हैं। AFAIK, अपरिवर्तनीय सभी सामान्य लिनक्स फाइल सिस्टम द्वारा समर्थित है (incl ext2 / 3/4 और xfs। Zfsonlinux इस समय सभी विशेषताओं का समर्थन नहीं करता है)


3
यह कभी-कभी उपयोगी है। btw, रूट भी एक अपरिवर्तनीय फ़ाइल को संशोधित या हटा नहीं सकता है (अपरिवर्तनीय विशेषता को हटाए बिना नहीं)। भी btw, lsattrसूची विशेषताओं का उपयोग करें।
कैस

2
+1 - मैं विशेषताओं के बारे में भूल गया था, और rmइस बारे में शाब्दिक प्रश्न का उत्तर देने में इतना व्यस्त था कि यह मेरे लिए भी कभी नहीं हुआ ...
ire_and_curses

2
यह फाइलसिस्टम विशिष्ट है और यह आपको और अधिक समस्याएं ला सकता है जो इसे हल करता है।
स्टीफन जिमेनेज़

4
@ मैग्नस: संभावित समस्याओं में बैकअप शामिल है (सभी बैकअप उपयोगिताओं में बैकअप विशेषताएँ नहीं होंगी - वास्तव में, अधिकांश नहीं होगी) और पुनर्स्थापित करें (यदि आप एक निर्देशिका को पुनर्स्थापित करते हैं जिसमें पहले से ही एक अपरिवर्तनीय फ़ाइल है, तो कुछ प्रोग्राम उस फ़ाइल को अधिलेखित करने में असमर्थता का इलाज करेंगे। एक घातक त्रुटि और गर्भपात के रूप में)। इसके अलावा, यदि आप भूल जाते हैं कि आपने किसी फ़ाइल को अपरिवर्तनीय और केंट फिगर बना दिया है, तो आप इसे क्यों नहीं हटा सकते? .... 'ऑपरेशन की अनुमति नहीं है' त्रुटि संदेश वही त्रुटि संदेश है जिसे आप किसी प्रकार की फाइलसिस्टम के साथ देखते हैं। भ्रष्टाचार, जो संभावित रूप से खतरनाक अति-प्रतिक्रिया को जन्म दे सकता है।
कैस

1
आप एक अपरिवर्तनीय फ़ाइल को कॉपी (cp) कर सकते हैं
ऑक्टोपस

0

इस प्रश्न का एक उत्तर यह दावा करता है कि आप निर्देशिका से किसी फ़ाइल को केवल तभी हटा सकते हैं जब उसके पास केवल writeअनुमति पूरी तरह से गलत हो! कर के देखो! निर्देशिका को केवल writeअनुमति दें और हटाने की कोशिश करें, आप नहीं कर सकते हैं!
एक निर्देशिका के अंदर एक फ़ाइल को हटाने के लिए आपको निर्देशिका पर अनुमति writeऔर executeअनुमति दोनों चाहिए

अब इस प्रश्न पर वापस जाएं: किसी फ़ाइल को हटाने के लिए rmआप केवल निर्देशिका से इसकी इनकोड जानकारी निकाल रहे हैं अर्थात आप shreddingडिस्क से नहीं हैं । यदि फ़ाइल की इनकोड जानकारी निर्देशिका में नहीं है, तो आप एक्सेस नहीं कर सकते हैं (क्योंकि आप इसे देख नहीं सकते क्योंकि यह इसके मूल निर्देशिका द्वारा सूचीबद्ध नहीं है) अर्थात यह आपके लिए हटा दी गई है।
इस प्रकार एक निर्देशिका से एक फ़ाइल को हटाने के लिए आपको निर्देशिका में अनुमति है; उस फ़ाइल पर अनुमतियाँ अप्रासंगिक हैं

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