ฉันสามารถอ่านจาก / dev / null; จะแก้ไขได้อย่างไร?


80

ผมอ่านบทความวิกิพีเดีย/dev/null/dev/nullและได้เล่นรอบโดยการย้ายไฟล์ไปยัง

สำหรับสิ่งนี้ฉันได้สร้างtest_fileและใส่เนื้อหาบางส่วนไว้

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

หลังจากนั้นฉันพยายามย้ายไฟล์ไปที่/dev/null:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

ตั้งแต่นี้ทำให้ฉันมีPermission deniedข้อผิดพลาด; ฉันไปข้างหน้าและใช้sudoตามปกติเมื่อใดก็ตามที่ฉันพบPermission deniedข้อผิดพลาด

$ sudo mv test_file /dev/null

คำสั่งสำเร็จและtest_fileไม่มีอยู่ในไดเรกทอรีอีกต่อไป

อย่างไรก็ตามบทความ Wikipedia บอกว่ามันเป็นไปไม่ได้ที่จะกู้คืนสิ่งที่ย้ายไป/dev/nullและให้EOFกระบวนการใด ๆ ที่พยายามอ่านจากมัน แต่ฉันสามารถอ่านได้จาก/dev/null:

$ cat /dev/null
This is written by Aditya

ฉันทำอะไรผิดและฉันจะแก้ไข/dev/nullกลับเป็นปกติได้อย่างไร และทำไมฉันถึงพบPermission deniedข้อผิดพลาดตั้งแต่แรก?

คำตอบ:


147

/dev/nullเป็นไฟล์ ไฟล์พิเศษ ไฟล์อุปกรณ์เช่น / dev / sda หรือ / dev / tty ที่พูดถึงชิ้นส่วนของฮาร์ดแวร์ในระบบของคุณ

ข้อแตกต่างเพียงอย่างเดียว/dev/nullคือไม่มีการเชื่อมโยงฮาร์ดแวร์ ข้อมูลใด ๆ ที่คุณส่งไปจะถูกลบทิ้งอย่างเงียบ ๆ ชอบคำสั่งดังต่อไปนี้:

echo "Hello World" > /dev/null

ซึ่งจะไม่พิมพ์อะไรบนเทอร์มินัลของคุณเพราะคุณส่งผลลัพธ์echoเป็นโมฆะไปที่ช่องว่างดังนั้นหลุมดำ

แต่เมื่อคุณทำmv test_file /dev/nullคุณแทนที่แฟ้มพิเศษโดยไฟล์ข้อความปกติถือสำเนาของเนื้อหาของของคุณ/dev/null test_fileคุณสูญเสียของคุณไป/dev/nullแล้ว

ตอนนี้สิ่งที่คุณต้องทำคือ (เพื่อสร้างใหม่):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

/dev/nullคุณควรจะสร้างมันเพราะมากของสคริปต์โดยค่าเริ่มต้นส่งออกไปยัง หาก/dev/nullไม่มีหลุมดำอีกต่อไป แต่เป็นไฟล์ข้อความปกติมันอาจขยายเติบโตและเติมเต็มระบบไฟล์ของคุณได้ และฉันแน่ใจว่าคุณต้องการหลีกเลี่ยงสิ่งนี้

และอันตรายยิ่งกว่านั้นสคริปต์จำนวนมากคิดว่าการอ่านจาก/dev/nullจะไม่อ่านอะไรเลย การทำลายสมมติฐานนี้อาจนำไปสู่การสุ่มขยะที่เขียนในไฟล์ทั่วระบบของคุณ ... เป็นไปไม่ได้ที่จะแก้ไข

และจำไว้ว่า Linux กำลังทำงานหลายอย่าง: ในขณะที่คุณกำลังเล่น/dev/nullกระบวนการจำนวนมากกำลังทำงานอยู่และสามารถสร้างความเสียหายได้แม้ในช่วงเวลาไม่กี่วินาที "หน้าต่างแห่งโอกาส"

หากคุณต้องการเล่นกับ/dev/nullคุณสามารถสร้างสำเนาและทดลองกับมัน:

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

จะสร้าง/tmp/nullไฟล์ที่ทำงานในลักษณะเดียวกัน/dev/nullแต่คุณสามารถจัดการและทดสอบได้โดยไม่ต้องเสี่ยงกับระบบของคุณ


16

มีความแตกต่างอย่างมากระหว่างการเขียนทับไฟล์และการเขียนลงไฟล์

เมื่อคุณเขียนบางสิ่ง /dev/nullเช่น

$ echo Hello > /dev/null

... มันถูกทิ้งอย่างเงียบ ๆ สำหรับสิ่งนี้คุณต้องมีสิทธิ์ในการเขียน/dev/nullซึ่งทุกคนมี:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

เมื่อคุณเขียนทับ /dev/nullเช่นเดียวกับที่คุณทำกับmvคำสั่งคุณแทนที่ไฟล์พิเศษ/dev/nullด้วยสิ่งที่คุณย้ายไปที่นั่น อย่าทำอย่างนี้! เหตุผลที่คุณต้องการสิทธิ์รูทในการทำเช่นนี้เพราะการเขียนทับไฟล์คุณต้องมีสิทธิ์เขียนไปยังไดเรกทอรีที่มีไฟล์ในกรณีนี้/dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

หากต้องการกู้คืนให้/dev/nullใช้คำสั่ง

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(ดูที่U&L StackExchange: วิธีสร้าง/dev/null )


8

เมื่อคุณเรียกใช้คำสั่ง

$ sudo mv test_file /dev/null

คุณได้แทนที่ไฟล์พิเศษ/dev/nullด้วยไฟล์ข้อความของคุณ ความพยายามที่ตามมาในการอ่านจากการ/dev/nullส่งคืนเนื้อหาของไฟล์ข้อความของคุณและโปรแกรมที่พยายามใช้/dev/nullในลักษณะปกติอาจแตก

การเปลี่ยนหรือลบไฟล์อุปกรณ์/dev/จำเป็นต้องมีสิทธิ์ผู้ใช้ขั้นสูงซึ่งเป็นสาเหตุที่ความพยายามที่ไม่ใช่ sudo ของคุณล้มเหลวด้วยข้อผิดพลาด

ดูคำตอบของเบอนัวต์สำหรับข้อมูลเกี่ยวกับวิธีการกู้คืน/dev/nullด้วยตนเอง แต่เนื่องจากส่วนใหญ่ (ถ้าไม่ทั้งหมด) ของเนื้อหาของ/dev/ถูกจัดการแบบไดนามิกโดย udev ฉันสงสัยว่าการรีบูตอย่างง่ายอาจแก้ไขได้เช่นกัน


6

ในการตอบคำถามของคุณเกี่ยวกับสิ่งที่คุณควรทำเมื่อต้องการลบไฟล์คุณต้องทำ:

rm test_file

ดังที่คนอื่น ๆ ได้กล่าวไว้ / dev / null เป็นปลายทางสำหรับผลลัพธ์ของโปรแกรม


2
ฉันไม่ได้ลงคะแนน แต่คำถามไม่ได้เกี่ยวกับการลบไฟล์ ... ฉันรู้ว่าเราใช้rmเพื่อลบไฟล์ / ไดเรกทอรี ... ฉันเพิ่งอ่านเกี่ยวกับ/dev/nullและเพื่อให้เข้าใจเพิ่มเติมเกี่ยวกับมันฉันพยายามย้ายไฟล์ไป/dev/nullและดู ผล .. คำถามนี้เกี่ยวกับการทำความเข้าใจกับสิ่งที่ฉันทำผิดโดยการย้ายไฟล์ไป/dev/nullเป็นผลจากที่ฉันสามารถอ่านได้ตอนนี้ ... คำถามไม่เกี่ยวกับวิธีลบไฟล์ออกจากระบบ ... ฉันหวังว่ามันจะเป็น ชัดเจน ... แต่คำตอบของคุณยังคงยินดีต้อนรับและดีพอที่จะถูกเก็บไว้เป็นคำตอบ ... :-)
Aditya

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