เหตุใดการย้ายไดเรกทอรีไปยัง / 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- มันเป็นไฟล์พิเศษที่เพียงแค่ดูดซับการเปลี่ยนเส้นทาง (และส่งพวกเขาไปสู่ความว่างเปล่า) หากคุณพยายามที่จะย้ายไดเรกทอรีไปยังระบบแฟ้มจะระเบิดในหน้าของคุณและถ้าคุณพยายามที่จะย้ายไฟล์ไปที่มันคุณอาจจะจบลงด้วยการแทนที่

ลิงก์แรกจะจัดการกับไดเรกทอรี แต่นี่เป็นการทดสอบแยกต่างหากสำหรับการเขียนทับไฟล์ Rmano ชี้ให้เห็นในความคิดเห็นนี่อาจเป็นสิ่งที่คุณไม่ควรทำโดยไม่ได้รับการดูแลจากผู้ใหญ่ มีความเสี่ยงที่เกี่ยวข้อง

$ 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 จะเป็นการโยนอุปกรณ์ null ของคุณและแทนที่ด้วยไฟล์นั้นโดยไม่ต้องกำจัดเนื้อหาของไฟล์
psusi

2
คำตอบนั้นค่อนข้างคลุมเครือ การย้ายไฟล์ไปที่/dev/nullจะไม่ส่งผลให้ข้อมูลนั้นถูกย้ายไปสู่ความว่างเปล่า มันจะส่งผลให้ข้อมูลที่ถูกย้ายเป็นไร แต่/dev/nullจะถูกเขียนทับและเพื่อให้คุณสามารถย้ายมันกลับไป :) ยังเห็นaskubuntu.com/questions/435887//
Malte Skoruppa

1
ใช่เพราะsudo mv file /dev/null จะประสบความสำเร็จและสามารถนำไปสู่ระบบที่ใช้ไม่ได้อย่างสมบูรณ์ ดูความคิดเห็นของฉันเกี่ยวกับคำถามที่ลิงก์ในความคิดเห็นของ @MalteSkoruppa นี่เป็นอีกตัวอย่างที่ชัดเจนของ "prepend sudoเฉพาะเมื่อคุณตรวจสอบสามครั้งคุณรู้ว่าคุณกำลังทำอะไร" ;-)
Rmano

5
คุณสามารถทำการทดลองสร้างสำเนา / dev / null ของคุณเอง: sudo mknod -m 0666 /tmp/mynull c 1 3--- จากนั้นเล่นกับมัน ;-)
Rmano

10
นี่คือที่คำถามที่ดีที่สุดมาจาก "เรียนถามอูบุนตูฉันเพิ่งย้ายการบ้านไปที่ / dev / null โดยไม่ได้ตั้งใจและถูกดูดเข้าไปในไฟล์กำหนดค่าระบบ 90% ตอนนี้ฉันเห็นบทความของเช็คสเปียร์ทุกครั้งที่ฉันบู๊ตและ trackpad ของฉันไม่ทำงาน Halp! "
Oli

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_dirask_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เป็นไฟล์พิเศษที่จะกำจัดไฟล์ที่ไม่ต้องการและสตรีมอินพุตและตามที่บทความ Wikipedia กล่าวถึงมันไม่ได้ให้ข้อมูลใด ๆ แก่กระบวนการที่อ่านจากมัน


การอ้างอิง: บทความ Wikipedia บน/dev/null


4
sudo mv test_file /dev/nullแทนที่ ด้วย/dev/null test_fileดังนั้นหลังจากนั้น/dev/nullเป็นไฟล์ปกติและคุณสามารถอ่านได้จากทุกสิ่งที่คุณเขียนลงไป อย่าทำอย่างนั้น
Florian Diesch

"ดังนั้นจึงเป็นไปไม่ได้ที่จะกู้คืนไฟล์ใด ๆ ที่คุณย้ายไปที่ / dev / null" การพูดอย่างไม่เป็นความจริง หากคุณต้องปิดระบบติดตั้งและเรียกใช้การกู้คืนข้อมูลคุณอาจกู้คืนไฟล์ได้หากยังไม่ได้เขียนทับ
pzkpfw

@FlorianDiesch: แก้ไขคำตอบแล้ว :)
Aditya

7

ทุกสิ่งที่ส่งไป/dev/nullจะถูกยกเลิกอย่างเงียบ ๆ หากคุณพิมพ์:

echo "Hello World"

คุณได้รับHello Worldบนหน้าจอ หากคุณพิมพ์:

echo "Hello World" >/dev/null

คุณไม่ได้อะไรเลยบนหน้าจอ

แต่ในกรณีของคำสั่ง move คำสั่งmvจะพยายามแทนที่ไฟล์ / dev / null โดยไดเรกทอรีสิ่งที่เป็นไปไม่ได้ เพราะทุกอย่างเป็นไฟล์ใน Linux / dev / null เป็นไฟล์ หลักสูตรพิเศษ (ไฟล์อุปกรณ์) เป็นไฟล์พิเศษที่อนุญาตให้เข้าถึงชิ้นส่วนของฮาร์ดแวร์ (เช่นดิสก์พาร์ติชันการ์ดเสียงพอร์ตอนุกรม ... ) ในกรณีของ / dev / null นี่ไม่ได้เชื่อมโยงกับฮาร์ดแวร์ใด ๆ ดังนั้นข้อมูลที่ส่งไปจะถูกทิ้งอย่างเงียบ ๆ นี่คือเหตุผลที่ "พวกเขา" อาจเรียกมันว่าเป็นหลุมดำ


ไดเรกทอรีไม่ใช่ไฟล์
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersenในโลก Linux ไดเรกทอรีเป็นไฟล์!
Habeeb Perwad

@HabeebPerwad ภายในเคอร์เนลเท่านั้น
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersenขอโทษนะฉันไม่ได้รับใน kernel ดังนั้นความคิดที่ไม่มี :)
Habeeb Perwad

"เพราะทุกอย่างเป็นไฟล์ใน Linux" - ไม่ถูกต้อง มีไฟล์และวัตถุประเภทอื่น ๆ อีกมากมาย ไม่แน่ใจว่าคุณได้รับสิ่งนี้จากที่ใด
ggPeti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.