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


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


160
2018-06-23 15:36


Источник


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


Ответы:


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


405
2018-06-23 17:53



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


Вот ссылка к исходному коду. Заметка /* Root is -A automatically. */, Это особенность версии Apple BSD ls,


15
2018-06-23 16:03



Интересная находка. Есть ли способ подавить скрытые файлы при выполнении ls? - Mr Lister
Хм, выглядит как это не специфичная для Apple функция, но она исходит из мира BSD? - kirelagin
Правильно, это не Apple. Спасибо за ваш ответ, он поставил меня на правильный путь. Я использовал Root is -A automatically строка для поиска подсказок. - kirelagin
Г-н Листер: вы можете подавлять отображение файлов точек с правами root -I (капитал i) во многих операционных системах (FreeBSD, возможно, и OS X) - Allan Jude


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


1
2018-06-25 21:27



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