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

7370
kirelagin

С 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
Я неправильно прочитал эти теги как «OSX - это плохо» и запутался. Raystafarian 8 лет назад 141
Было бы менее запутанным, если бы теги были разрешены в верхнем регистре, здесь более уместны `BSD` и` OSX`. ryenus 8 лет назад 5
@Raystafarian довольно забавный, потому что обычно все наоборот, люди пытаются писать предложения с тегами. Braiam 8 лет назад 0

3 ответа на вопрос

405
kirelagin

It turns out this feature is not Apple-specific. This is a feature of BSD systems in general.

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

Initially, I was able to trace it back to the sources of 4.4BSD-Lite. It was already present in this FreeBSD commit from 1994 which is importing those sources.

The feature is also present in OpenBSD and can be found in this commit from 1995 that claims to be importing code from NetBSD, so this was already present in NetBSD.

Then one discovers the commit of NetBSD from 1993 that claims to be importing code from 386BSD, and the feature is already there. Furthermore, this commit shows that it was there during the development of 386BSD version 0.0 in 1991 which forked from BSD around 4.3, as far as I can tell.

The comment appeared for the first time during the development of 4.3BSD-Reno in this commit (27 Jun 1989) entitled “first working version of new ls”. The original comment said:

/* root sees all files automatically */ 

which was changed later that day (I’m not sure the timestamps are entirely correct in this repository, though) to:

/* root is -A automatically */ 

And only in 1992 the capital letter and the period were added turning the comment into what we have now:

/* Root is -A automatically. */ 

But the behaviour was present in 2BSD as of 9 May 1979 as seen in this snapshot:

Aflg = getuid() == 0; 

I can’t find any actual history from those times, but there is also this snapshot of 1BSD from 1977 without those lines. And without the -A flag actually.

So it seems that the feature was introduced somewhere between November of 1977 (1BSD being developed at that moment) and the release of 2BSD in May 1979.


What I also found during this investigation, is the -I flag that was added to FreeBSD in 2005 to override this behaviour and was reworked a little bit later.

Также, возможно, стоит отметить, что «особенность» скрытия файлов, начиная их с `.`, была простой ошибкой -` ls` должен был только скрывать каталог `.`, а не все, начинающееся с` .`. Перенесемся на несколько десятилетий, и он обычно используется для скрытия опасных файлов и т. Д., А также для скрытия конфигурации системы и т. Д., Поэтому имеет смысл позволить администраторам просматривать эти файлы (для поддержания конфигурации или для поиска скрытых вредоносных программ и т. Д.) , Luaan 8 лет назад 52
Ссылка на комментарий Луана: https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (в котором Роб Пайк объясняет, что скрытие «точечных файлов» начиналось как ошибка). nibot 8 лет назад 23
Из Обоснования POSIX: «Некоторые исторические реализации утилиты ls показывают все записи в каталоге, кроме точки и точки-точки, когда суперпользователь вызывает ls без указания опции -a. Когда« обычные »пользователи вызывают ls без указания -a, они не должен видеть информацию о файлах с именами, начинающимися с если они не были названы файловыми операндами. "http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html R.. 8 лет назад 2
Это намного старше. Я думаю, что это предшествовало разделению SysV-BSD, так как в прошлый раз, когда у меня был доступ к системам SysV, было точно такое же поведение. Joshua 8 лет назад 0
@Joshua: я смущен вашим комментарием. В этом ответе прослеживается особенность 1977-1979 гг., Которая существовала до появления Системы V. ruakh 8 лет назад 0
эпический ответ. история узнала! Corey Goldberg 8 лет назад 3
Может быть, это просто сходится. Joshua 8 лет назад 0
15
fd0

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

Интересная находка. Есть ли способ подавления скрытых файлов при выполнении команды ls? Mr Lister 8 лет назад 0
Хм, [похоже] (http://lists.freebsd.org/pipermail/freebsd-bugs/2007-March/022861.html) это не специфичная для Apple функция, но она происходит из мира BSD? kirelagin 8 лет назад 5
Правильно, это не специфично для Apple. Спасибо за ваш ответ, это поставило меня на правильный путь. Я использовал строку `Root is -A автоматически` для поиска улик. kirelagin 8 лет назад 2
Мистер Листер: во многих операционных системах (FreeBSD, так что, вероятно, OS X) вы также можете запретить отображение точечных файлов как root с помощью -I (заглавная i). Allan Jude 8 лет назад 0
1
tachijuan

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

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