Tại sao '/' có mục '..'?


81

Điều này luôn làm tôi bối rối. Tại sao thư mục gốc chứa tham chiếu đến thư mục cha?

bob @ bob: / $ ls -a
. xây dựng nhà lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old bị mất + tìm thấy Proc selinux usr
khởi động vv lib phương tiện truyền thông gốc srv var

Tôi hiểu cách các thư mục được quản lý trong hệ thống tập tin - mỗi thư mục có n + 2 con trỏ tới chính nó (n = số thư mục con bên trong thư mục). Một cho mỗi thư mục con ngay lập tức, một cho cha mẹ của nó và một cho chính nó.

Nhưng /cha mẹ là gì?

Câu trả lời:


73

/..chỉ vào /:

$ ls -id /
2 /
$ ls -id /..
2 /..

Cả hai đều có cùng số inode, là 2 trên hệ thống này. (Giá trị chính xác không thành vấn đề.)

Nó được thực hiện cho sự nhất quán. Theo cách này, không cần phải có mã trong kernel để kiểm tra xem nó hiện đang ở đâu khi nó xử lý ..một đường dẫn. Bạn có thể nói cd ..mãi mãi, và không bao giờ đi sâu hơn gốc.


20
@George Tôi tin rằng các khai thác lợi dụng các đường dẫn tương đối sử dụng điều đó; bạn không cần phải đoán thư mục hiện tại, bạn chỉ cần làm../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
Điều gì khác biệt sẽ làm cho chỉ với việc sử dụng / etc / passwd?
jlliagre

9
@jlliagre: Có những chương trình kiểm tra xem một tập tin có nằm trong thư mục hiện tại hay không bằng cách kiểm tra xem nó có bắt đầu hay không /. Giữa ../(không nhất thiết phải ở đầu!) Và các liên kết tượng trưng, ​​rất khó để thực hiện, đặc biệt là xem xét kẻ tấn công có thể đang di chuyển các thư mục dưới mũi của chương trình.
Gilles

4
Tôi thấy, ít nhất họ nên sử dụng canonicalize_file_name hoặc realpath.
jlliagre

5
@musiphil: Đó là một điều tốt. Michael chỉ chỉ ra rằng đó là một tính năng có thể bị khai thác cho mục đích xấu, nếu mã không được viết để đối phó với việc khai thác. Nếu chúng ta loại bỏ tất cả các tính năng có thể khai thác, máy tính sẽ là những thứ rất buồn tẻ.
Warren Young

38

Nó ở đó bởi vì đó là một sự đảm bảo được tạo bởi Unix: mỗi thư mục chứa hai mục, .trong đó đề cập đến chính nó và ..đề cập đến cha mẹ.

Thư mục gốc của không gian tên hiện tại là đặc biệt, trong đó ..chỉ ra điều tương tự ., nhưng không quá đặc biệt để phá vỡ sự bảo đảm của HĐH đối với các chương trình. Khi những hợp đồng đó bị phá vỡ, mọi thứ trở nên sai lầm và mọi người đều chỉ tay.

Thư mục gốc mà bạn thấy có thể, trong hệ thống tập tin trên đĩa, thực sự có một thư mục mẹ khác. Khung nhìn của các hệ thống tập tin được cung cấp trong không gian tên được gắn kết là những gì thực thi .. = .quy tắc cho /. Vì vậy, nếu bạn đang ở trong chroot()tù, bạn sẽ thấy /.. = /mặc dù có ai đó ở ngoài trại nhìn vào /path/to/jail/..sẽ thấy /path/to.


1
Có bao nhiêu chương trình phụ thuộc vào "hợp đồng" /..điểm đó? Tôi nghĩ rằng nó có thể được chấp nhận như nhau (hoặc hơn) mà /KHÔNG phải có ...
musiphil

Có ai có một nguồn xác nhận lý thuyết này?
Julian Hollmann

1
Chà, man 5 dirtrên hệ thống BSD sẽ đưa bạn qua API tài liệu và các mục được nêu trong API là một phần của hợp đồng.
Phil P

1
find có một tối ưu hóa dựa trên hợp đồng n + 2.
ctrl-alt-delor

2
Ồ, và tất nhiên nếu bạn muốn có một nguồn thì hãy đọc thông số kỹ thuật. POSIX tại pubs.opengroup.org/onlinepub/9699919799 trong phần 4.12: "Dấu chấm tên tệp đặc biệt sẽ tham chiếu đến thư mục được chỉ định bởi người tiền nhiệm của nó. Dấu chấm tên đặc biệt sẽ tham chiếu đến thư mục mẹ của thư mục tiền thân. trong trường hợp, trong thư mục gốc, dấu chấm có thể đề cập đến chính thư mục gốc. "
Phil P
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.