160

С OS X Yosemite, используя следующие команды, я получаю следующее:

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

Он показывает скрытые файлы (имена которых начинаются с точки) при вызове root и не показывает их (как и ожидалось) при работе от имени обычного пользователя. Это отличается от того, что делает ls в Linux (тот, что исходит от coreutils).

Почему ls ведет себя так?

3 ответа3

405

Оказывается, эта функция не специфична для Apple. Это особенность систем BSD в целом.

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

Изначально мне удалось отследить его до источников 4.4BSD-Lite. Он уже присутствовал в этом коммите FreeBSD 1994 года, который импортирует эти источники.

Эта функция также присутствует в OpenBSD, и ее можно найти в этом коммите 1995 года, который утверждает, что импортирует код из NetBSD, поэтому он уже присутствовал в NetBSD.

Затем обнаруживается фиксация NetBSD с 1993 года, которая утверждает, что импортирует код из 386BSD, и эта функция уже есть. Кроме того, этот коммит показывает, что он был там во время разработки 386BSD версии 0.0 в 1991 году, которая, насколько я могу судить, разветвлялась от BSD около 4.3.

Комментарий появился впервые при разработке 4.3BSD-Reno в этом коммите (27 июня 1989 г.) под названием «первая рабочая версия new ls». Оригинальный комментарий сказал:

/* root sees all files automatically */

который был изменен позднее в тот же день (хотя я не уверен, что временные метки в этом репозитории полностью верны):

/* root is -A automatically */

И только в 1992 году были добавлены заглавная буква и точка, что превратило комментарий в то, что мы имеем сейчас:

/* Root is -A automatically. */

Но поведение присутствовало в 2BSD по состоянию на 9 мая 1979 года, как видно на этом снимке:

Aflg = getuid() == 0;

Я не могу найти никакой реальной истории тех времен, но есть также снимок 1BSD 1977 года без этих строк. И без флага -A самом деле.

Таким образом, кажется, что эта функция была введена где-то между ноябрем 1977 года (1BSD разрабатывается в тот момент) и выпуском 2BSD в мае 1979 года.


В ходе этого расследования я также обнаружил флаг -I который был добавлен во FreeBSD в 2005 году для переопределения этого поведения и был переработан чуть позже.

15

Вот ссылка на исходный код. Примечание /* Root is -A automatically. */ . Это функция в версии от Apple из BSD ls

1

IIRC, была тема об этом еще в первые дни Usenet (начало 80-х). Эта функция была добавлена в качестве меры безопасности, чтобы злоумышленники не могли легко спрятать файлы / каталоги / исполняемые файлы от sysadmin / root. Теория была в основном «root имеет доступ ко всему, поэтому он должен видеть все».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .