कब से POSIX और GNU rm डिलीट / नहीं करते हैं?


23

कई वर्षों के लिए, GNU rmउपयोगिता /तब तक नहीं हटेगी जब तक कि उसे --no-preserve-rootविकल्प के साथ नहीं बुलाया जाता है । हालांकि, कमांड rm -rf /को सामूहिक अवचेतन में बहुत लंबे समय के लिए खतरनाक के रूप में दर्ज किया गया है और लोग अभी भी अक्सर इसे "डरावना" कमांड के रूप में उद्धृत करते हैं।

मैं सोच रहा था कि यह नियम जो पहले rmनहीं हटा सकता था, /दिखाई दिया। मैंने POSIX चश्मा की जाँच की, और मैं देख सकता हूँ कि POSIX: 2008 में यह सुरक्षा सुविधा शामिल है, POSIX: 2001 नहीं है। चूंकि प्रत्येक नए उप-विमोचन के साथ, POSIX चश्मा के ऑनलाइन संस्करण समय-समय पर अपडेट किए जाते हैं, मैंने भी वेकबैक मशीन की जांच की और 2010 से POSIX: 2008 का प्रासंगिक पृष्ठ पाया और यह पुष्टि करने में सक्षम था कि नियम जो rmनहीं हटा सकता है /पहले से ही सूचीबद्ध था।

तो, मेरे सवाल हैं:

  • जब नियम था कि POSIX चश्मा में जोड़ा rmनहीं हटा सकते हैं /? क्या यह एकल UNIX विशिष्टता संस्करण 4 के मूल 2008 संस्करण में था या इसे किसी संशोधन में जोड़ा गया था?
  • इस सीमा को GNU में कब जोड़ा गया था rm? मुझे पूरा यकीन है कि यह POSIX में जोड़े जाने से पहले था, लेकिन यह कब हुआ?


1
संबंधित: ऑस्टिन ग्रुप इंटरप्रिटेशन # 019 (2003), जिसने परिवर्तन का वर्णन (लेकिन लागू नहीं किया)।
माइकल होमर

जवाबों:


28

आप POSIX 2008 के सभी संस्करणों का HTML संस्करण ऑनलाइन देख सकते हैं:

जिसे 2008 के संस्करण में जोड़ा गया था।

तकनीकी गलियारा आम तौर पर नई सुविधाओं को नहीं जोड़ता है।

आप पिछला संस्करण देख सकते हैं ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) में वह पाठ नहीं था।

मानक के बाद के संशोधन में शामिल करने के लिए नए पाठ को 2003-05-09 आस्टिन समूह सम्मेलन में स्वीकार किया गया था ।

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

जॉन बेक ने लिखा, मंगल पर 11 मार्च 2003:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

जीएनयू rmने 2003-11-09 की प्रतिबद्धताओं में विकल्प --preserve-rootऔर --no-preserve-rootविकल्प शामिल किए , लेकिन 2006-09-03 की प्रतिबद्धताओं में केवल यही डिफ़ॉल्ट था , इसलिए कोरुटिल्स में 6.2--preserve-root

FreeBSD उस स्लैश को संरक्षित कर रहा है जो 2004-10-04 के बाद से किया गया था ( "यह पता लगाएं कि मेरे अंडरवियर वास्तव में लौ-प्रूफ कैसे है" कमिट लॉग के साथ), लेकिन शुरू में तब नहींPOSIXLY_CORRECT , जब तक कि एक दशक बाद जांच करने के लिए याद न कर लिया जाए कि POSIX अब था यह इंगित करते हुए कि यह किस बिंदु पर POSIX मोड में भी किया गया था

फ्रीबीएसडी प्रारंभिक प्रतिबद्ध उल्लेख सोलारिस उस समय पहले से ही कर रहा था।

@JdePB (नीचे टिप्पणी में) ने पाया कि एक सूर्य अंदरूनी सूत्र की कहानी को लिंक करने और सोलारिस मूल के बारे में अधिक जानकारी देने और सोलिस के सुझाव देने से पहले ही ऑस्टिन समूह से अनुरोध करने से पहले ही उनके पास सुरक्षित जगह थी।

यह उस बहिष्करण को जोड़ने के औचित्य को समझाता है। जबकि कोई केवल अपने आप को दोष दे सकता है यदि वे करते हैं rm -rf /, तो एक ऐसा मामला है जहां एक स्क्रिप्ट ऐसा कर सकती है अगर वह rm -rf -- "$1/$2"बिना जांच किए $1/ $2जो प्रदान किया गया है जो कि सोलिस पैच (उस लिंक के अनुसार) का दुरुपयोग करते समय कुछ सन ग्राहकों को बुरा लगता है।

को हटाने से मना किया गया था .और उससे ..बहुत पहले जोड़ा गया था और फिर से संभावित दुर्घटनाओं के खिलाफ सुरक्षा के लिए। rmअभी भी एक खतरनाक आदेश है। यह वही करता है जो यह करने के लिए होता है: जो आप इसे बताते हैं उसे हटा दें।

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

सब कुछ भी निकाल देंगे। जब आप करते हैं तो शेल फ़ाइलनाम पूर्णता ऐसी समस्याओं का कारण बनती है

rm -rf someth<Tab>/*

इसका विस्तार किया गया:

rm -rf something /*

क्योंकि somethingऐसा हुआ नहीं एक निर्देशिका है।

गोले की तरह tcshया zshजब कॉल करने के लिए कोशिश कर रहा एक अतिरिक्त शीघ्र जोड़ देगा rmएक साथ *वाइल्डकार्ड ( tcshडिफ़ॉल्ट रूप से नहीं)।



1
एक युवा सह-ऑप SA के रूप में, मैंने SunOS w / rm -rf .*में अपने होम डायर से उपयोगकर्ता की निर्देशिका में छिपी हुई फाइलों को मिटाने की कोशिश की । कुछ ही समय बाद, सभी फोन लाइनें जल
उठीं

मैंने $ rm -rf की शर्त लगाई। * = rm -rf / एक जटिल तरीके से वहाँ पहुँचने के लिए।
Escoce

@GuruAdrian सुनिश्चित करें, * का अर्थ है कि सब कुछ मेल खाता है। * = .filename लेकिन यह भी ../ और इसलिए ../ .. और ..///.. .. विज्ञापन infinatum जब तक आप कमांड के लिए बिटस्पेस से बाहर नहीं निकलते।
एस्कोस

शायद आधुनिक गोले में। यह हमेशा ऐसा नहीं था। मैंने 15 साल पहले सिस्टम एडमिनिस्ट्रेशन और डेवलपमेंट की उस गहराई को छोड़ दिया था
Escoce
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.