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


Với OS X Yosemite, sử dụng các lệnh sau, tôi nhận được những điều sau đây:

$ 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ởi gốc và không hiển thị chúng (như mong đợi) khi chạy với tư cách người dùng bình thường. Điều này khác với những gì ls trên Linux (cái này đến từ coreutils) làm.

Tại sao ls cư xử theo cách này?


160
2018-06-23 15:36


gốc


Tôi hiểu sai những thẻ này là "OSX là xấu" và đã thực sự bối rối. - Raystafarian
Sẽ khó hiểu hơn nếu các thẻ được cho phép bằng chữ hoa, BSD và OSXthích hợp hơn ở đây. - ryenus
@Raystafarian khá buồn cười, bởi vì bình thường là cách khác xung quanh, mọi người cố gắng viết câu bằng thẻ. - Braiam


Các câu trả lời:


Nó chỉ ra tính năng này không phải là cụ thể của 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 nguồn gốc của 4.4BSD-Lite. Nó đã có mặt trong cam kết FreeBSD này từ năm 1994 là nhập khẩu các nguồn đó.

Tính năng này cũng có mặt 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ó mặt 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ừ 386BSDvà tính năng đã sẵn sàng ở đó. Hơn nữa, cam kết này cho thấy rằng nó đã có trong quá trình phát triển 386BSD phiên bản 0.0 vào năm 1991 mà chia ra từ BSD khoảng 4.3, theo như tôi có thể nói.

Nhận xét 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/06/1989) mang tên “phiên bản làm việc đầu tiên của các ls mới”. Bình luận ban đầu cho biết:

/* root sees all files automatically */

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

/* root is -A automatically */

Và chỉ vào năm 1992 bức thư vốn và thời kỳ đã được thêm vào biến bình luận 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 ả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ừ những thời điểm đó, nhưng cũng có ảnh chụp nhanh này của 1BSD từ năm 1977 không có những dòng đó. Và không có -A cờ thực sự.

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


Những gì tôi cũng tìm thấy trong cuộc điều tra này, là -I gắn cờ đã được thêm vào sang FreeBSD năm 2005 để ghi đè hành vi này và làm lại một chút sau.


405
2018-06-23 17:53



Ngoài ra, có thể đáng lưu ý rằng "tính năng" của các tệp ẩn bằng cách bắt đầu chúng bằng . là một lỗi đơn giản - ls chỉ được phép che giấu . thư mục, không phải mọi thứ đều bắt đầu bằng .. Nhanh chóng chuyển tiếp vài thập kỷ và 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. - do đó, hãy cho phép 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, v.v.) . - Luaan
Tài liệu tham khảo cho bình luận của Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (trong đó Rob Pike giải thích rằng việc ẩn "các tệp chấm" bắt đầu là lỗi). - nibot
Từ lý do POSIX, "Một số triển khai lịch sử của tiện ích l hiển thị tất cả các mục trong một thư mục ngoại trừ dấu chấm và dấu chấm khi siêu người dùng gọi l mà không chỉ định tùy chọn -a. Khi người dùng" bình thường "gọi l 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/onlinepubs/9699919799/utilities/ls.html - R..
Nó xa hơn rất nhiều. Tôi nghĩ rằng nó trước khi phân chia SysV-BSD như lần cuối cùng tôi có quyền truy cập vào hệ thống SysV chính xác hành vi tương tự đã có mặt. - Joshua
câu trả lời sử thi. lịch sử đã học! - Corey Goldberg


Đây là đường dẫn vào mã nguồn. chú thích /* Root is -A automatically. */. Đây là một tính năng trong phiên bản BSD của Apple ls.


15
2018-06-23 16:03



Thú vị tìm thấy. Có cách nào để ngăn chặn các tập tin ẩn khi làm một ls? - Mr Lister
Hm, giống như đây không phải là một tính năng cụ thể của Apple, nhưng nó đến từ thế giới BSD? - kirelagin
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 automatically chuỗi để tìm kiếm manh mối. - kirelagin
Mr Lister: bạn có thể chặn hiển thị các tệp dấu chấm dưới dạng gốc với -I (vốn i) trên nhiều hệ điều hành (FreeBSD, vì vậy có lẽ cả OS X) - Allan Jude


IIRC, đã có một chủ đề về việc này 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 an ninh để người dùng độc hại không thể dễ dàng ẩn các tập tin / thư mục / tập tin thực thi từ sysadmin / root. Lý thuyết cơ bản là "root có quyền truy cập vào mọi thứ để nó có thể thấy mọi thứ".


1
2018-06-25 21:27



Âm thanh hợp lý (mặc dù chuyển một tệp thành tệp dot-dot là một cách đáng ngờ để "ẩn" nó). Sẽ là tuyệt vời để tìm những kho lưu trữ đó. - kirelagin