На OS X почему `sudo ls` показывает скрытые (точечные) файлы?

162

С 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себя ведет?

kirelagin
источник
141
Я неверно истолковал эти теги как «OSX плох» и запутался.
Raystafarian
5
Было бы менее запутанным, если бы теги были разрешены в верхнем регистре, BSDи OSXздесь более уместно
ryenus
@Raystafarian довольно забавный, потому что обычно все наоборот, люди пытаются писать предложения с тегами.
Брайам

Ответы:

404

Оказывается, эта функция не специфична для 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 году для отмены этого поведения и был переработан чуть позже.

kirelagin
источник
52
Также, возможно, стоит отметить, что «особенность» скрытия файлов с помощью их запуска .была простой ошибкой - lsпредполагалось, что она скрывает только .каталог, а не все, с чего начинается .. Перенесемся на несколько десятилетий, и он обычно используется для скрытия опасных файлов и т. Д., А также для скрытия конфигурации системы и т. Д., Поэтому имеет смысл позволить администраторам просматривать эти файлы (для поддержания конфигурации или для поиска скрытых вредоносных программ и т. Д.) ,
Луаан
23
Ссылка на комментарий Луана: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (в котором Роб Пайк объясняет, что скрытие «точечных файлов» начиналось как ошибка).
nibot
2
Из Обоснования POSIX: «Некоторые исторические реализации утилиты ls показывают все записи в каталоге, кроме точки и точки-точки, когда суперпользователь вызывает ls без указания опции -a. Когда« обычные »пользователи вызывают ls без указания -a, они не должен видеть информацию о любых файлах с именами, начинающимися с <периода>, если они не были названы как файловые операнды. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
Это намного старше. Я думаю, что это предшествовало разделению SysV-BSD, так как в прошлый раз, когда у меня был доступ к системам SysV, было точно такое же поведение.
Джошуа
3
эпический ответ. история узнала!
Кори Голдберг
15

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

fd0
источник
Интересная находка. Есть ли способ подавления скрытых файлов при выполнении ls?
мистер Листер
5
Хм, похоже, что это не особенность Apple, но это происходит из мира BSD?
Кирелагин
2
Правильно, это не специфично для Apple. Спасибо за ваш ответ, это поставило меня на правильный путь. Я использовал Root is -A automaticallyстроку для поиска улик.
Кирелагин
Мистер Листер: вы можете запретить отображение точечных файлов как root с помощью -I (заглавная i) во многих операционных системах (FreeBSD, а значит, и OS X)
Аллан Джуд,
1

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

tachijuan
источник
Звучит разумно (хотя превращение файла в точечный файл является сомнительным способом «скрыть» его). Было бы здорово найти эти архивы.
Кирелагин