Câu trả lời:
man
(lệnh, không phải người dùng) là một ứng dụng trợ giúp. Các ứng dụng cung cấp các trang man trong các gói của chúng nhưng man
cần biết chúng ở đâu và cũng giúp chúng cung cấp những gì. Để tăng tốc mọi thứ - vì vậy man
không tìm kiếm toàn bộ hệ thống tập tin khi bạn nhập man <command>
- những trang man này được lập chỉ mục vào cơ sở dữ liệu bằng một lệnh được gọi mandb
.
Trong Ubuntu mandb
lưu trữ các chỉ mục trong cơ sở dữ liệu GNU gdbm tại /var/cache/man/index.db
(và một vài phiên bản ngôn ngữ cụ thể trong cùng thư mục). Đây là một cơ sở dữ liệu băm khóa-giá trị không giống với memcache, hoặc hàng trăm triển khai khác trên các ý tưởng tương tự. Đó là nhị phân, nhẹ và nhanh. Tôi sẽ đưa ra một ví dụ về cách chơi với nó vào cuối.
Lập chỉ mục này được lên kế hoạch để chạy hàng ngày trong Ubuntu bởi /etc/cron.daily/man-db
. Toàn bộ tập lệnh chạy dưới quyền root và thực hiện một số thao tác dọn dẹp trước nhưng ngay khi kết thúc, chúng ta thấy mandb
được chạy với tư cách là man
người dùng:
# --pidfile /dev/null so it always starts; mandb isn't really a daemon,
# but we want to start it like one.
start-stop-daemon --start --pidfile /dev/null \
--startas /usr/bin/mandb --oknodo --chuid man \
$iosched_idle \
-- --no-purge --quiet
Đó không phải là thay đổi nhóm, đó là lý do tại sao tất cả quyền sở hữu nhóm trong /var/cache/man
đó vẫn là root.
Nhưng tại sao lại mandb
chạy như một người dùng khác? Nó có thể (có thể) chạy tốt như root
vậy nhưng nó đang xử lý đầu vào từ nhiều nguồn khác nhau (nhìn vào manpath
). Hoạt động với tư cách là người dùng của chính nó bảo vệ hệ thống khỏi quá trình thổi bùng lên, hay tệ hơn nữa là bị khai thác bởi các trang người đàn ông không đúng định dạng, bị hỏng hoặc độc hại.
Điều tồi tệ nhất có thể xảy ra sẽ chỉ ảnh hưởng đến man
chỉ mục trang. Boo Hoo. Bạn có thể xác nhận rằng với một cái gì đó như:
sudo -u man find / -writable 2>/dev/null
Và bạn có thể sử dụng phương pháp đó để xem mức độ thiệt hại mà bất kỳ người dùng nào có thể gây ra trên hệ thống. Đó là một ý tưởng tốt để kiểm tra quyền truy cập tệp của bạn (tôi chỉ phát hiện ra rằng bất kỳ người dùng nào cũng có thể xóa toàn bộ bộ sưu tập nhạc của tôi chẳng hạn).
Bạn có thể nhìn vào cơ sở dữ liệu với accessdb
. Dưới đây là một vài hồ sơ ngẫu nhiên:
$ accessdb | shuf -n3
fpurge -> "- 3 3 1380819168 A - - gz purge a stream"
fcgetlangs -> "FcGetLangs 3 3 1402007131 A - - gz Get list of languages"
ipython -> "- 1 1 1393443907 A - - gz Tools for Interactive Computing in Python."
Mặc dù không hoàn toàn rõ ràng ở trên, thực tế có các trường được phân tách bằng tab trong đó:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Bạn có thể đọc thêm về nội dung trường thực tế trong hướng dẫn kỹ thuật .