มีไดเรกทอรีเทียบเท่า / dev / null ใน Linux หรือไม่


84

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

ฉันสงสัยว่า: Linux มีไดเรกทอรีว่างเปล่าเริ่มต้นที่สามารถใช้เพื่อวัตถุประสงค์ดังกล่าวได้หรือไม่ ฉันรู้ว่า OpenSSH ใช้ / var / empty อยู่ครู่หนึ่งและแน่นอนฉันสามารถสร้าง dir ที่ว่างเปล่าได้ด้วยตัวเอง แต่บางที FHS ได้ระบุไดเรกทอรีมาตรฐานสำหรับสิ่งนี้


8
ในระบบของฉัน/var/emptyไม่ว่างเปล่า แต่มีโฟลเดอร์ชื่อsshdดังนั้นคุณอาจไม่ต้องการใช้มัน
knub

12
เพียงจุด: ลักษณะพิเศษของการ/dev/nullเป็นไม่มากสำหรับการอ่านกับการเขียน ข้อมูลที่เขียนไปยัง/dev/nullเพิ่งหายไป ดังนั้นไดเรกทอรีเทียบเท่าจะเป็นสถานที่ที่mv yourfile /dev/emptyจะส่งผลให้การลบไฟล์ของคุณ
Wildcard

4
@Wildcard mv yourfile /dev/empty/ฉันเข้าใจคุณหมายถึง หากคุณเป็นเช่นmv yourfile /dev/emptyนั้นคุณกำลังพยายามแทนที่ไดเรกทอรีพิเศษ
Rhymoid

6
@Jules ไม่มันไม่ใช่ คุณไม่สามารถเริ่มต้นสิ่งใดด้วย/dev/nullและddเพราะddจะได้รับ EOF ก่อนที่จะเขียนแม้แต่ไบต์เดียว ฉันคิดว่าคุณกำลังคิดถึง/dev/zeroซึ่งมักใช้เพื่อเติมบางสิ่งบางอย่างด้วยหรือสร้างเลขศูนย์เฉพาะ
Micheal Johnson

2
@MichealJohnson คุณขวาผิดพลาดของฉันฉันสับสนกับ/dev/null /dev/zero
จูลส์

คำตอบ:


66

FHSให้ไม่มี "มาตรฐาน" ไดเรกทอรีที่ว่างเปล่า

เป็นเรื่องปกติที่ระบบ Linux จะจัดทำไดเรกทอรี/var/emptyแต่ไดเรกทอรีนี้ไม่ได้กำหนดไว้ใน FHS และอาจไม่ว่างเปล่า แต่ daemons บางตัวจะสร้างไดเรกทอรีว่างเปล่าของตัวเองที่นี่ ตัวอย่างเช่น openssh ใช้ไดเร็กทอรีว่าง/var/empty/sshdสำหรับการแยกสิทธิพิเศษ

หากต้องการของคุณสำหรับ directory ว่างชั่วคราวคุณสามารถสร้าง directory ว่างด้วยตัวคุณเองเป็นไดเรกทอรีย่อยของหรือ/run /tmpหากคุณทำสิ่งนี้นอกโปรแกรมคุณสามารถใช้mktemp -dสำหรับสิ่งนี้หรือใช้mkdtemp(3)ฟังก์ชัน C ในโปรแกรมของคุณ แม้ว่าคุณจะต้องมีไดเรกทอรีว่างอยู่เสมอให้สร้างไดเรกทอรีภายใต้/var/emptyopenssh

สำหรับกรณีการใช้งานนี้การสร้างไดเรกทอรีภายใต้/tmpน่าจะเหมาะสมที่สุด แต่ในทางปฏิบัติแล้วมันไม่สำคัญว่าคุณจะวางไว้ตรงไหน


5
ฉันจะไม่แนะนำให้สร้างไดเรกทอรีย่อยภายใต้/var/emptyเนื่องจากโปรแกรมใด ๆ ที่ใช้มัน (เช่น OpenSSH ในการกำหนดค่าเริ่มต้น ) อาจคาดว่ามันจะว่างเปล่าจริง ๆ ( /var/empty/sshdสิ่งที่ดูเหมือนจะแปลก RedHat-ism; ใช้เดเบียน/var/run/sshdแทน.)
Ilmari Karonen

3
@IlmariKaronen รหัสบิตที่คุณเชื่อมโยงไม่สนับสนุนการยืนยันของคุณที่ OpenSSH คาดว่า/var/emptyจะว่างเปล่า มีที่อื่นที่อาจมองหาสิ่งนี้หรือไม่
Michael Hampton

2
@IlmariKaronen หืมมเอกสารนั้นล้าสมัยแล้ว มันหมายถึงแต่รหัสใช้จริง/var/empty /var/empty/sshdลองอีกครั้ง. :)
Michael Hampton

1
@IlmariKaronen อืม ตอนนี้ฉันคิดว่าคุณพูดถูกแล้วหลังจากดูแหล่งข้อมูลที่เรียก chroot () อย่างแท้จริง ฉันพบว่ามันน่าทึ่งที่จะมีข้อบกพร่องที่เห็นได้ชัดเช่นนี้ใน opensh ซึ่ง Red Hat จะต้องแก้ไขการดาวน์สตรีม
Michael Hampton

2
ฉันไม่เห็นว่ามันเป็น "ข้อบกพร่องที่โง่เขลา" - การมีไดเรกทอรีรากที่ว่างเปล่าที่รับประกันได้ในตำแหน่งมาตรฐานเพื่อใช้เป็นคุก chroot ดูเหมือนจะเป็นความคิดที่ดีอย่างสมบูรณ์แบบสำหรับฉัน แน่นอน RedHat ต้องไปและทำลายมันสำหรับทุกคนโดยการสร้างไดเรกทอรีย่อยภายใต้มัน ดังนั้นคำแนะนำของฉันสำหรับรหัสพกพาจะไม่ใช้/var/emptyกับสิ่งใดเนื่องจากคุณไม่สามารถมั่นใจได้ถึงความหมายของมันในระบบใด ๆ การสร้างไดเรกทอรีว่างของคุณเองเช่นภายใต้/var/runอย่าง Debian นั้นดูเหมือนสมเหตุสมผลกว่า
Ilmari Karonen

37

คุณสามารถใช้เพื่อสร้างไดเรกทอรีชั่วคราวใหม่ที่ว่างเปล่าที่มีสิทธิ์ในการรักษาความปลอดภัยโดยเริ่มต้นในmktemp -d /tmp/ยูทิลิตี้จะส่งออกเส้นทางของไดเรกทอรีใหม่เปิดSTDOUTดังนั้นมันจึงมีประโยชน์ในเปลือก

มันพกพาได้ดีกว่าไฟล์ systemd unit


ใช่คุณทำได้ แต่ไม่สามารถปฏิบัติได้หากต้องระบุไดเรกทอรีนั้นในไฟล์กำหนดค่า คุณต้องการ dir ถาวรสำหรับสิ่งนั้น
roelvanmeer

22

คำถามนี้ยูนิกซ์มีคำแนะนำสำหรับการสร้างไดเรกทอรี "ต้องห้าม" รวมทั้งระบบแฟ้ม nullfs FUSE


1
ฉันไม่รู้ว่าทำไมคำตอบ mktemp / mkdtemp จึงถูกอัปโหลดอย่างหนักเมื่อนี่เป็นคำตอบที่สมบูรณ์แบบ nullfs เทียบเท่า / dev / null
chx

11

สำหรับ services systemd ให้ตัวเลือกPrivateTmpในการสร้างไพรเวต/tmpและ/var/tmpไดเร็กทอรีที่ไม่ถูกแบ่งใช้โดยกระบวนการภายนอกเนมสเปซสำหรับเซอร์วิสนั้นและควรว่างเปล่า (เริ่มแรก)

[Service]
ExecStart=...
PrivateTmp=yes 

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