Trên OS X, tại sao `sudo ls` hiển thị các tệp bị ẩn (dấu chấm)?


162

Với OS X Yosemite, sử dụng các lệnh sau, tôi nhận được các thông tin sau:

$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a  b
$ sudo /bin/ls
.a  b

Nó hiển thị các tệp ẩn (có tên bắt đầu bằng dấu chấm) khi được gọi bằng root và không hiển thị chúng (như mong đợi) khi chạy như một người dùng bình thường. Điều này khác với những gì lstrên Linux (cái đến từ coreutils).

Tại sao lshành xử theo cách này?


141
Tôi đã đọc sai các thẻ đó là "OSX rất tệ" và thực sự bối rối.
Raystafarian

5
Sẽ ít gây nhầm lẫn hơn nếu các thẻ được cho phép viết hoa BSDOSXthích hợp hơn ở đây.
ryenus

@Raystafarian khá buồn cười, vì thông thường là cách khác, mọi người cố gắng viết câu bằng thẻ.
Braiam

Câu trả lời:


404

Hóa ra tính năng này không dành riêng cho Apple. Đây là một tính năng của các hệ thống BSD nói chung.

/* Root is -A automatically. */
if (!getuid())
    f_listdot = 1;

Ban đầu, tôi có thể theo dõi nó trở lại các nguồn của 4.4BSD-Lite . Nó đã có mặt trong bản cam kết FreeBSD này từ năm 1994 đang nhập các nguồn đó.

Tính năng này cũng có trong OpenBSD và có thể được tìm thấy trong cam kết này từ năm 1995, tuyên bố sẽ nhập mã từ NetBSD, vì vậy điều này đã có trong NetBSD .

Sau đó, người ta phát hiện ra cam kết của NetBSD từ năm 1993 tuyên bố sẽ nhập mã từ 386BSD và tính năng này đã sẵn . Hơn nữa, cam kết này cho thấy rằng nó đã ở đó trong quá trình phát triển phiên bản 386BSD 0.0 vào năm 1991, rẽ nhánh từ BSD khoảng 4.3, theo như tôi có thể nói.

Nhận xét này xuất hiện lần đầu tiên trong quá trình phát triển 4.3BSD-Reno trong cam kết này (27 tháng 6 năm 1989) mang tên Phiên bản làm việc đầu tiên của ls mới. Nhận xét ban đầu cho biết:

/* root sees all files automatically */

đã được thay đổi sau ngày hôm đó (tuy nhiên tôi không chắc dấu thời gian hoàn toàn chính xác trong kho lưu trữ này) thành:

/* root is -A automatically */

Và chỉ trong năm 1992, chữ in hoa và thời kỳ được thêm vào để biến nhận xét thành những gì chúng ta có bây giờ:

/* Root is -A automatically. */

Nhưng hành vi đã có mặt trong 2BSD kể từ ngày 9 tháng 5 năm 1979 như đã thấy trong ảnh chụp nhanh này :

Aflg = getuid() == 0;

Tôi không thể tìm thấy bất kỳ lịch sử thực tế nào từ thời đó, nhưng cũng có ảnh chụp nhanh 1BSD từ năm 1977 mà không có những dòng này. Và không có -Acờ thực sự.

Vì vậy, có vẻ như tính năng này đã được giới thiệu ở đâu đó giữa tháng 11 năm 1977 (1BSD đang được phát triển tại thời điểm đó) và phát hành 2BSD vào tháng 5 năm 1979.


Điều tôi cũng tìm thấy trong cuộc điều tra này, là -Ilá cờ đã được thêm vào FreeBSD năm 2005 để ghi đè hành vi này và được làm lại một lát sau đó.


52
Ngoài ra, có thể đáng chú ý rằng "tính năng" của việc ẩn tệp bằng cách khởi động chúng .là một lỗi đơn giản - lschỉ được cho là để ẩn .thư mục, không phải mọi thứ bắt đầu .. Nhanh chóng chuyển tiếp vài thập kỷ và nó thường được sử dụng để ẩn các tệp nguy hiểm, v.v., đồng thời được sử dụng để ẩn cấu hình hệ thống, v.v. - vì vậy sẽ rất hợp lý khi cho quản trị viên xem các tệp đó (để duy trì cấu hình hoặc tìm phần mềm độc hại ẩn, v.v.) .
Luaan

23
Tham khảo cho nhận xét của Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (trong đó Rob Pike giải thích rằng việc ẩn "tệp chấm" bắt đầu là một lỗi).
nibot

2
Từ Cơ sở lý luận POSIX, "Một số triển khai lịch sử của tiện ích ls hiển thị tất cả các mục trong thư mục ngoại trừ dấu chấm và dấu chấm khi siêu người dùng gọi ls mà không chỉ định tùy chọn -a. Khi người dùng" bình thường "gọi ls mà không chỉ định -a, họ không nên xem thông tin về bất kỳ tệp nào có tên bắt đầu bằng <period> trừ khi chúng được đặt tên là toán hạng tệp. " pubs.opengroup.org/onlinepub/9699919799/utilities/ls.html
R ..

Nó xa hơn nhiều. Tôi nghĩ rằng nó có trước sự phân chia SysV-BSD vì lần trước tôi có quyền truy cập vào các hệ thống SysV, hành vi tương tự chính xác đã có mặt.
Joshua

3
câu trả lời sử thi. lịch sử đã học!
Corey Goldberg

15

Đây là một liên kết đến mã nguồn. Lưu ý /* Root is -A automatically. */. Đây là một tính năng trong phiên bản BSD của Apple ls.


Thú vị tìm thấy. Có cách nào để chặn các tập tin ẩn khi thực hiện ls không?
Ông Lister

5
Hừm, có vẻ như đây không phải là một tính năng dành riêng cho Apple, nhưng nó đến từ thế giới BSD?
kirelagin

2
Phải, nó không phải là cụ thể của Apple. Cảm ơn câu trả lời của bạn, nó đưa tôi đi đúng hướng. Tôi đã sử dụng Root is -A automaticallychuỗi để tìm kiếm manh mối.
kirelagin

Mr Lister: bạn có thể ngăn chặn việc hiển thị các tệp chấm dưới dạng root với -I (capital i) trên nhiều hệ điều hành (FreeBSD, vì vậy có lẽ là OS X)
Allan Jude

1

IIRC, đã có một chủ đề về điều này trở lại trong những ngày đầu của Usenet (đầu những năm 80). Tính năng này đã được thêm vào như một biện pháp phòng ngừa bảo mật để người dùng độc hại không thể dễ dàng ẩn các tệp / thư mục / tệp thực thi khỏi sysadmin / root. Lý thuyết về cơ bản là "root có quyền truy cập vào mọi thứ để nó có thể nhìn thấy mọi thứ".


Nghe có vẻ hợp lý (mặc dù việc biến một tập tin thành tập tin dấu chấm là một cách đáng nghi ngờ của việc ẩn giấu nó). Sẽ là tuyệt vời để tìm thấy những tài liệu lưu trữ.
kirelagin
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.