निर्देशिकाओं को / dev / null के लिए खतरनाक क्यों माना जाता है?


28

test_dirनिर्देशिका को स्थानांतरित करने का प्रयास करते समय /dev/null, मुझे संदेश मिलता है

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

फिर लोग यह क्यों कहते हैं कि "कमांड न चलाएं sudo mv ~ /dev/null, यह आपके होम डायरेक्टरी को छेद में ले जाएगा?"

संपर्क

लेकिन /homeएक निर्देशिका भी है।

जवाबों:


39

क्योंकि लोग मान लेते हैं। मैं उन लोगों में से एक था जब तक मैंने इसका परीक्षण नहीं किया । यह समझना आसान है कि लोगों को लगता है ... यह लग रहा है खतरनाक ...

... लेकिन आप वास्तव में चीजों को स्थानांतरित नहीं कर सकते हैं /dev/null- यह एक विशेष फ़ाइल है जो सिर्फ पुनर्निर्देशन को अवशोषित करती है (और उन्हें शून्य में भेजती है)। यदि आप इसके लिए एक निर्देशिका को स्थानांतरित करने का प्रयास करते हैं, तो फ़ाइल सिस्टम आपके चेहरे पर मौखिक रूप से फट जाएगा और यदि आप किसी फ़ाइल को उसके पास स्थानांतरित करने का प्रयास करते हैं, तो आप संभवतः इसे प्रतिस्थापित करना समाप्त कर देंगे।

पहला लिंक निर्देशिकाओं से निपटेगा, लेकिन यहाँ एक फ़ाइल के साथ इसे लिखने के लिए एक अलग परीक्षण है। जैसा कि रमनो टिप्पणियों में बताते हैं, यह संभवतः कुछ ऐसा है जो आपको वयस्क पर्यवेक्षण के बिना नहीं करना चाहिए। इसमें जोखिम शामिल है।

$ echo "this is my file" > test
$ cat test
this is my file

$ sudo mv test /dev/null
$ cat /dev/null
this is my file

# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

2
नहीं, फ़ाइल को / dev / null में ले जाने से आपका नल डिवाइस बाहर हो जाएगा और इसे उस फ़ाइल से बदल दिया जाएगा, फ़ाइल की सामग्री से छुटकारा नहीं मिलेगा।
Psusi

2
जवाब थोड़ा अस्पष्ट है। किसी फ़ाइल को /dev/nullले जाने से उस डेटा को परिणाम में नहीं ले जाया जा सकता है। इसके परिणामस्वरूप डेटा ठीक हो जाएगा, लेकिन /dev/nullअधिलेखित हो जाएगा, और इसलिए आप इसे अभी तक वापस ले जा सकते हैं :) इसके अलावा askubuntu.com/questions/435887/… पर
Malte Skoruppa

1
हां, क्योंकि सफल sudo mv file /dev/null होगा , और आसानी से पूरी तरह से अनुपयोगी प्रणाली हो सकती है। @MalteSkoruppa की टिप्पणी से जुड़े प्रश्न पर मेरी टिप्पणियाँ देखें। इसका एक और स्पष्ट उदाहरण है " sudoकेवल तभी प्रीपेंड करें जब आप तीन बार चेक करते हैं कि आप जानते हैं कि आप क्या कर रहे हैं"; ;-)
Rmano

5
आप अपने खुद के / देव / अशक्त की प्रतिलिपि बनाने का प्रयोग कर सकते हैं: sudo mknod -m 0666 /tmp/mynull c 1 3--- और फिर इसके साथ खेल सकते हैं ;-)
Rmano

10
यह वह जगह है जहाँ से सबसे अच्छे प्रश्न आते हैं। "प्रिय पूछो उबंटू, मैंने हाल ही में अपने होमवर्क को गलती से / dev / null में स्थानांतरित कर दिया था और इसे 90% मेरे सिस्टम कॉन्फ़िगरेशन फ़ाइलों में चूसा गया था। मैं अब हर बार जब मैं बूट करता हूं तो शेक्सपियर निबंध देखता हूं। और मेरा ट्रैकपैड काम नहीं करता है। हेल्प! "
ओली

18

/dev/nullयह एक फ़ाइल है, यह एक "विशेष चरित्र" फ़ाइल है, लेकिन यह अभी भी उन नियमों से बाध्य है जो फ़ाइलों का पालन करना चाहिए। कहा जा रहा है कि आप इस आदेश को कभी नहीं चला सकते हैं:

$ mv ~ /dev/null

mvआदेश यह अनुमति नहीं दी जाएगी जब से तुम एक फाइल करने के लिए एक निर्देशिका जा रहे हैं, यह सिर्फ समझ में प्रासंगिक रूप से नहीं है और mvइस को जानता है।

उदाहरण

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’

/dev/nullयदि आप इस पर एक नियमित फ़ाइल को कॉपी करने का प्रयास करते हैं, तो आप इसे कॉपी नहीं कर सकते हैं ।

$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw-  1 root root        1,   3 Mar 16 14:25 null

केवल एक चीज के बारे में जो आप इस फ़ाइल में कर सकते हैं mvवह है इसे दूसरी फ़ाइल पर कॉपी करना या इसे हटाना।

$ mv /path/to/afile /dev/null

इस आदेश के बाद, /dev/nullएक नियमित फ़ाइल है। इस परिवर्तन का सबसे खतरनाक प्रभाव यह है कि किसी भी डेटा का उत्पादन कभी नहीं/dev/null करना चाहिए , इसलिए कई शेल स्क्रिप्ट यह मान लेंगे

`... < /dev/null` 

"कुछ नहीं" कहने के बराबर है। इस धारणा के टूटने से यादृच्छिक डेटा (ठीक है, डेटा अंतिम प्रक्रिया को `/ dev / null 'को लिखा जाता है) सिस्टम फाइल के चारों ओर डाला जा सकता है --- जिससे पूरी तरह से टूटा हुआ और अपरिवर्तनीय सिस्टम हो सकता है।


13

आप फ़ाइलों या अन्य इनपुट धाराओं को लिख सकते हैं, /dev/nullलेकिन निर्देशिकाओं को नहीं। यदि आप एक निर्देशिका को स्थानांतरित करने का प्रयास करते हैं, तो /dev/nullयह एक त्रुटि की रिपोर्ट करेगा क्योंकि /dev/nullएक निर्देशिका नहीं है, लेकिन एक फ़ाइल है।

हालाँकि, जब से आप प्रयोग करना चाहते हैं /dev/null, आपको सबसे पहले एक फाइल को स्थानांतरित करने के परिणामों को जानने का सुझाव दिया जाता है /dev/nullऔर उस प्रक्रिया को कैसे पुनर्प्राप्त करना है:

जैसा कि उस प्रश्न के उत्तर में @Rmano द्वारा सुझाया गया है , हमारे साथ प्रयोग करने के लिए बल्कि इसकी एक प्रति तैयार करनी चाहिए और फिर अपना प्रयोग करना चाहिए। तो, चलिए इसे बनाते हैं और इसे हमारे प्रयोग प्रयोजनों के लिए उपयोग करते हैं:/dev/null/tmp/null

sudo mknod -m 0666 /tmp/null c 1 3

अब आगे, /tmp/nullहमारे /dev/nullसभी उद्देश्यों के लिए है:

आइए हम एक test_fileऔर test_dirअंदर एक निर्देशिका बनाते हैं जिसे कहा जाता है ask_ubuntu

$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file

निम्नलिखित ask_ubuntuनिर्देशिका की सामग्री को दर्शाता है :

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya    0 Mar 18 17:10 test_file

अब हमारी ले जाने की कोशिश test_fileकरने के लिए /tmp/nullऔर की सामग्री देखने ask_ubuntu:

$ sudo mv test_file /tmp/null   # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

आदेश सफल होता है और test_fileअब उपलब्ध नहीं है। अब ले जाने की कोशिश test_dirकरने के लिए /tmp/nullजो सफल नहीं होता:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’

test_dirअभी भी अंदर मौजूद है ask_ubuntu:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

अब, यदि हम अपने test_fileसे ठीक कर सकते हैं, तो हमें बताएं /tmp/null:

$ cat /tmp/null
Let us test if we can recover our test_file.

इसलिए, यह अभी भी वहां है और /tmp/nullजो एक विशेष फाइल अधिलेखित हो गई थी और यह किसी भी अन्य सामान्य फ़ाइल की तरह हो गई है। हम /tmp/nullकिसी अन्य फाइल की तरह ही कॉपी करके अपनी फाइल को रिकवर कर सकते हैं :

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.

फाइल बरामद।

ध्यान दें:

यदि आपने /tmp/nullउन आदेशों का सीधे निर्माण और उपयोग नहीं किया है /dev/null; सुनिश्चित करें कि आप फ़ाइल को पुनर्प्राप्त कर रहे हैं (यदि आपको ज़रूरत है) चलाकर cp /dev/null our_test_file; और /dev/nullनिम्न आदेशों को यथाशीघ्र लिंक किए गए लिंक पर चलाकर हमारे सिस्टम पर मौजूद उद्देश्यों के लिए पुनर्स्थापित करें :

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

निष्कर्ष:

  • इसलिए, निर्देशिका को स्थानांतरित करना असंभव है /dev/nullऔर इसलिए वहां से निर्देशिका को पुनर्प्राप्त करने का कोई सवाल ही नहीं है।

  • जहाँ तक फ़ाइलों का संबंध है, यदि आप सीधे फ़ाइलों को स्थानांतरित करते हैं /dev/null, तो आप अभी भी इसे ऊपर बताए अनुसार पुनर्प्राप्त कर सकते हैं। हालांकि, दो अपवाद हैं:

    1. आपके द्वारा चलाए जा रहे अवधि के दौरान sudo mv test_file /dev/nullऔर cp /dev/null our_test_file, यदि सिस्टम में कोई रूट स्क्रिप्ट रनिंग echo "Whatever text the root script wants to send to /dev/null" > /dev/null(या अन्य समान कमांड) द्वारा इसे अधिलेखित कर देता है। तब हमारे पास अपनी फ़ाइल को पुनर्प्राप्त करने का कोई आसान तरीका नहीं है।

    2. यदि आप उन दो कमांड को चलाने के बीच सिस्टम को रिबूट करते हैं। /dev/nullबूट पर फिर से बनाया जाता है, इसलिए जब हम कंप्यूटर बंद करते हैं, तो हमारी फ़ाइल खो जाती है।

  • लेकिन अगर आप इनपुट धाराओं को पुनर्प्राप्त करना चाहते हैं echo "Stream this line to /dev/null" > /dev/null, तो आप पुनर्प्राप्त नहीं कर सकते क्योंकि /dev/nullअवांछित फ़ाइलों और इनपुट धाराओं को हटाने के लिए एक विशेष फ़ाइल है और जैसा कि विकिपीडिया लेख में उल्लेख किया गया है, यह उस प्रक्रिया को कोई डेटा प्रदान नहीं करता है जो इससे पढ़ता है।


संदर्भ: विकिपीडिया अनुच्छेद पर/dev/null


4
sudo mv test_file /dev/nullके /dev/nullसाथ बदल देता है test_file। तो उसके बाद /dev/nullयह केवल एक सामान्य फ़ाइल है और आप इसमें से कुछ भी लिख सकते हैं।
दोपहर

"तो, किसी भी फ़ाइल को पुनर्प्राप्त करना संभव नहीं है जिसे आपने / देव / नल में स्थानांतरित कर दिया है" सख्ती से सच नहीं बोल रहा है। यदि आप सिस्टम को बंद करना चाहते थे, तो इसे माउंट करें और उस पर डेटा रिकवरी चलाएं, यदि आप इसे अधिलेखित नहीं किया गया था, तो आप फ़ाइल को पुनर्प्राप्त करने में सक्षम हो सकते हैं।
pzkpfw

@FlorianDiesch: उत्तर अपडेट किया गया :)
आदित्य

7

भेजी गई हर चीज /dev/nullको चुपचाप छोड़ दिया जाता है। यदि आप टाइप करते हैं:

echo "Hello World"

आप Hello Worldस्क्रीन पर आते हैं। यदि आप टाइप करते हैं:

echo "Hello World" >/dev/null

आपको स्क्रीन पर कुछ भी नहीं मिलता है।

लेकिन चाल कमांड के मामले में, कमांड mvनिर्देशिका द्वारा फ़ाइल / देव / नल को बदलने की कोशिश करती है, जो संभव नहीं है। क्योंकि सब कुछ लिनक्स में एक फाइल है, / dev / null एक फाइल है। एक विशेष कोर्स (एक डिवाइस फ़ाइल), एक विशेष फ़ाइल जो हार्डवेयर के टुकड़े तक पहुँचने की अनुमति देता है (जैसे डिस्क, विभाजन, साउंड कार्ड, सीरियल पोर्ट, ...)। / Dev / null के मामले में, यह हार्डवेयर के किसी भी टुकड़े से जुड़ा नहीं है, इसलिए इसे भेजे गए डेटा को चुपचाप छोड़ दिया जाता है। यही कारण है कि "वे" ने इसे ब्लैकहोल कहा हो सकता है।


निर्देशिका फ़ाइलें नहीं हैं।
थोरबजोर्न रेवन एंडरसन

1
@ ThorbjørnRavnAndersen लिनक्स की दुनिया में, निर्देशिका फाइलें हैं!
हबीब परवाद

@ हबीबपर्वाड केवल कर्नेल के अंदर।
थोरबजोरन रावन एंडरसन

@ ThorbjørnRavnAndersen क्षमा करें, मैं कर्नेल में नहीं आया, इसलिए कोई विचार नहीं है
Habeeb Perwad

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