Có một thư mục tương đương với / dev / null trong Linux không?


84

Khi định cấu hình một ứng dụng, bạn thường có thể sử dụng /dev/nullnhư tệp cấu hình nếu bạn muốn ứng dụng đọc một tệp trống. Nhưng, nếu ứng dụng đọc danh sách các tệp từ một thư mục, bạn không thể sử dụng thủ thuật này. Bạn sẽ cần phải cung cấp cho nó một thư mục trống để đọc.

Tôi đã tự hỏi: Linux có một thư mục trống mặc định có thể được sử dụng cho các mục đích như vậy không? Tôi biết OpenSSH đã sử dụng / var / trống trong một thời gian và tất nhiên tôi có thể tự tạo một thư mục trống, nhưng có lẽ FHS đã chỉ định một thư mục chuẩn cho việc này?


8
Trên hệ thống của tôi, /var/emptykhông trống, nhưng chứa một thư mục được gọi sshd, vì vậy bạn có thể không muốn sử dụng nó.
quỳ 7/12/2016

12
Chỉ là một điểm: Khía cạnh đặc biệt /dev/nullkhông quá nhiều để đọc như viết. Dữ liệu được viết để /dev/nullbiến mất. Vì vậy, một thư mục tương đương sẽ là nơi mv yourfile /dev/emptysẽ dẫn đến việc xóa tệp của bạn.
tự đại diện

4
@Wildcard Tôi đoán bạn có nghĩa là mv yourfile /dev/empty/. Nếu bạn làm thế mv yourfile /dev/empty, bạn đang cố gắng thay thế thư mục đặc biệt.
Rhymoid

6
@Jules Không, không phải vậy. Bạn không thể khởi tạo bất cứ điều gì với /dev/nullddbởi vì ddsẽ nhận được EOF trước khi nó thậm chí viết một byte đơn. Tôi nghĩ rằng bạn đang nghĩ đến /dev/zero, thường được sử dụng để điền vào một cái gì đó với hoặc tạo ra một số không cụ thể.
Micheal Johnson

2
@MichealJohnson bạn nói đúng, lỗi của tôi, tôi đã nhầm lẫn /dev/nullvới /dev/zero.
Jules

Câu trả lời:


66

Các đảm bảo VSATTP cung cấp không "chuẩn" thư mục rỗng.

Các hệ thống Linux thường cung cấp một thư mục /var/empty, nhưng thư mục này không được xác định trong FHS và có thể không thực sự trống. Thay vào đó, một số trình nền nhất định sẽ tạo các thư mục trống của riêng họ ở đây. Chẳng hạn, openssh sử dụng thư mục trống /var/empty/sshdđể phân tách đặc quyền.

Nếu nhu cầu của bạn về một thư mục trống là nhất thời, bạn có thể tự tạo một thư mục trống, dưới dạng thư mục con của /runhoặc /tmp. Nếu bạn đang làm điều này bên ngoài chương trình, bạn có thể sử dụng mktemp -dcho việc này hoặc sử dụng mkdtemp(3)chức năng C bên trong chương trình của bạn. Mặc dù nếu bạn luôn cần có thư mục trống để hiện diện, hãy xem xét việc tạo một thư mục bên dưới /var/emptynhư openssh.

Đối với trường hợp sử dụng này, việc tạo một thư mục bên dưới /tmpcó lẽ là phù hợp nhất, mặc dù trong thực tế, việc bạn đặt nó ở đâu không quan trọng lắm.


5
Tôi không khuyên bạn nên tạo thư mục con bên dưới /var/empty, vì bất kỳ chương trình nào sử dụng nó (như OpenSSH trong cấu hình mặc định của nó ) có thể mong đợi nó thực sự trống. (Thứ /var/empty/sshddường như là một RedHat-ism kỳ lạ; Debian sử dụng /var/run/sshdthay thế.)
Ilmari Karonen

3
@IlmariKaronen Đoạn mã bạn đã liên kết không hỗ trợ khẳng định của bạn rằng OpenSSH dự kiến ​​sẽ /var/emptytrống. Có nơi nào khác người ta có thể tìm kiếm điều này?
Michael Hampton

2
@IlmariKaronen Hừm, tài liệu đó đã hết hạn. Nó đề cập đến /var/emptynhưng mã thực sự sử dụng /var/empty/sshd. Thử lại. :)
Michael Hampton

1
@IlmariKaronen Hmm. Bây giờ tôi nghĩ bạn đã đúng, sau khi thực sự nhìn vào nguồn mà cuộc gọi chroot (). Tôi thấy thật đáng kinh ngạc khi có một lỗ hổng rõ ràng ngu ngốc như vậy trong opensh, rằng Red Hat sẽ phải duy trì sự điều chỉnh xuôi dòng cho.
Michael Hampton

2
Tôi không thấy đó là một "lỗ hổng ngu ngốc" - có một thư mục sở hữu gốc trống được đảm bảo tại một địa điểm tiêu chuẩn, để sử dụng như một nhà tù chroot, có vẻ như là một ý tưởng hoàn toàn tốt đối với tôi. Tất nhiên, RedHat phải đi và hủy hoại nó cho mọi người, bằng cách tạo ra các thư mục con bên dưới nó. Do đó, khuyến nghị của tôi về mã di động sẽ không được sử dụng /var/emptycho bất cứ điều gì, vì bạn không thể chắc chắn về ngữ nghĩa của nó trên bất kỳ hệ thống nào. Tạo thư mục trống của riêng bạn, ví dụ như /var/run, như Debian, có vẻ hợp lý hơn.
Ilmari Karonen

37

Bạn có thể sử dụng mktemp -dđể tạo một thư mục tạm thời trống mới với quyền bảo mật, theo mặc định trong /tmp/. Tiện ích sẽ xuất đường dẫn của thư mục mới trên STDOUT, vì vậy nó rất hữu ích trong trình bao.

Dù sao nó cũng dễ mang theo hơn một tệp đơn vị systemd.


Có, bạn có thể, nhưng điều đó là không thực tế nếu thư mục đó phải được chỉ định trong tệp cấu hình. Bạn sẽ muốn một dir vĩnh viễn cho điều đó.
roelvanmeer


11

Đối với dịch vụ systemd cung cấp tùy chọn PrivateTmptạo riêng tư /tmpvà các /var/tmpthư mục không được chia sẻ bởi các quy trình bên ngoài không gian tên cho dịch vụ đó và sẽ trống (ban đầu).

[Service]
ExecStart=...
PrivateTmp=yes 

7
Chương trình có thể tạo các tệp tạm thời khác, vì vậy bạn không thể cho rằng /tmpsẽ trống chỉ vì nó được đặt tên.
Michael Hampton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.