ตรวจสอบสิ่งที่ถูกส่งไปยัง / dev / null?


19

เพื่อความสนุกสนาน:
มีวิธีในการตรวจสอบ / จับภาพ / ถ่ายโอนข้อมูลสิ่งที่เขียนไป/dev/nullหรือไม่?

บน Debian หรือ FreeBSD หากเป็นไปได้โซลูชันเฉพาะของ OS อื่น ๆ ก็ยินดีเช่นกัน


3
เป็นไปได้ แต่เป็นคำตอบและความคิดเห็นที่อธิบายเป็น / มาก / มากไม่ใช่ความคิดที่ดี
Shadur

2
@Shadur: อาจมีวิธีแก้ปัญหาที่ไม่ดี แต่นั่นก็ไม่ได้ทำให้ความคิดไม่น่าสนใจหรือเป็นความคิดที่ไม่ดี
jlliagre

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

คำตอบ:


12

การสร้างไพพ์ที่/dev/nullมีชื่อน่าจะเป็นวิธีที่ง่ายที่สุด ถูกเตือนว่าบางโปรแกรม ( sshdเช่น) จะทำหน้าที่ผิดปกติหรือไม่สามารถทำงานได้เมื่อพบว่าไม่ใช่ไฟล์พิเศษ (หรืออาจอ่านได้/dev/nullโดยคาดหวังให้ส่งคืนEOF)

# Remove special file, create FIFO and read from it
rm /dev/null && mkfifo -m622 /dev/null && tail -f /dev/null
# Remove FIFO, recreate special file
rm /dev/null && mknod -m666 /dev/null c 1 3

สิ่งนี้ควรทำงานภายใต้ดิสทริบิวชัน Linux และ BSD หลัก


1
สิ่งหนึ่งที่ควรทราบคือหากการtailล้มเหลวโปรแกรมจำนวนมากอาจล้มเหลวเนื่องจากบัฟเฟอร์ของไปป์เต็ม
Arcege

4
โปรแกรมที่อ่าน/dev/nullไม่ได้เป็นแบบนี้
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

@Gilles - แน่นอนดังนั้นบันทึกของฉัน
Chris Down

3
@Ali ใช่ No magicเป็นหลักการชี้นำในปรัชญา UNIX
Phihag

4
อะแฮ่ม/dev/null เป็นเวทย์มนตร์mknod /dev/null c 1 3เป็นสูตรเวทมนต์ที่จะเรียกใช้ (และคุณต้องการพลังพิเศษสำหรับ ... )
Stéphane Gimenez

6

ฉันเคยพบวิธีที่ยากที่ / dev / null ไม่จำเป็นต้องเป็นไฟล์ dev พิเศษ เมื่อนานมาแล้ว / dev / null บนระบบ Ultrix ในที่ทำงานถูกลบดังนั้นในครั้งต่อไปที่โปรแกรมเปลี่ยนเส้นทางไปที่ / dev / null มันก็กลายเป็นไฟล์ปกติที่เต็มไปด้วยผลลัพธ์จากโปรแกรมนั้น (ฉันคิดว่ามันเป็น 'ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว' ซึ่งหมายความว่าเมื่อเราพยายามที่จะคิดออกว่าเกิดอะไรขึ้นเราจะทำcat /dev/nullและได้รับการบอกว่าno such file or directoryสับสนกับเราออกมาจากไหน)

ดังนั้นข้อเสนอแนะของฉันจะถูกแทนที่ด้วยไพพ์ที่มีชื่อแล้วแนบโปรแกรมเข้ากับไพพ์ที่จะอ่านและตรวจสอบ


4
โปรแกรมจำนวนมากยังพึ่งพาการ/dev/nullส่งคืน 0 ไบต์ในการอ่าน ( cat /dev/null > foo) เสมอ หาก/dev/nullเป็นไฟล์ปกติที่มีเนื้อหาจะทำให้ความคาดหวังนี้ผิดไป
Arcege

1
ใช่นั่นคือวิธีที่เราค้นพบมัน โปรแกรมคาดหวังว่าจะไม่มีการป้อนข้อมูลและรับจำนวนมากรวมถึง / dev / ที่ได้รับการเติมเต็ม
พอลทอมบลิน

1

ฉันคิดว่าเป็นความคิดที่ / dev / null สามารถ symlink ไปยัง file descriptor แต่ด้วยกลไกการเพิ่มรหัสเพื่อตรวจสอบการดำเนินการอ่านหรือเขียนและถ้ามันอ่านแล้วมันควรจะอ่านจริงจาก / dev / actualnull แยกจากกันด้วย mknod และถ้ามันถูกเขียนให้จดบันทึกโปรแกรมที่เรียกใช้และพยายามที่จะบันทึก / นับสำหรับการวิเคราะห์โปรแกรมที่ใช้ / dev / null สำหรับการเขียน นี่จะเป็นค่าใช้จ่ายจำนวนมากในแง่ของประสิทธิภาพฉันคิดว่า ฉันเดาว่ามันใช้ไม่ได้เนื่องจากเชลล์โปรแกรมหรือโค้ดส่วนใหญ่ใช้การเปลี่ยนเส้นทางอยู่แล้ว อาจ inotify สามารถใช้ในการตรวจสอบการใช้งานของ / dev / null? หรือเขียนรหัสเคอร์เนลที่จัดการกับอุปกรณ์ 1: 3 อีกครั้งรวบรวมและติดตั้งอีกครั้งสามารถทดลองได้


2
ยังมีปัญหาบางอย่างฉันพยายามทำสิ่งนี้ (ไม่ใช่ในเคอร์เนล แต่โปร่งใส - ish โดยอนุญาตให้อ่านจากไฟล์อื่นและควบคุม/dev/nullจาก daemon) และsshdยังคงบ่นและจะไม่เริ่ม
Chris Down

hmm..interesting on / dev / null ควบคุมจาก daemon ฉันคิดว่าโปรแกรมส่วนใหญ่ต้องการใช้ / dev / null เป็นเพียงไฟล์อื่นที่ให้ความสำคัญและความหมายของ / dev / null ไปยังระบบ
Nikhil Mulley

ดีsshd(อย่างน้อยเป็นแพคเกจสำหรับ Debian Squeeze) บ่นsshd: cannot create /dev/nullถ้ามันเป็นอะไร แต่การใช้งานที่พบบ่อยที่สุด
Chris Down
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.