Чому в 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

Він показує приховані файли (імена яких починаються з крапки), коли викликається коренем, і не показує їх (як очікувалося) при запуску як звичайний користувач. Це відрізняється від того, що робиться lsв Linux (той, що виходить coreutils).

Чому так lsповодиться?


141
Я неправильно прочитав ці теги як "OSX поганий" і дуже заплутався.
Райстафаріан

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 р.) Під назвою "перша робоча версія нового 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 році, щоб змінити таку поведінку та був перероблений трохи пізніше.


52
Крім того, можливо, варто відзначити, що "особливістю" приховування файлів, запускаючи їх, .була проста помилка - lsпередбачалося приховати лише .каталог, а не все, починаючи з цього .. Швидкий рух вперед на кілька десятиліть, і він зазвичай використовується для приховування небезпечних файлів і т.д., а також використовується для приховування конфігурації системи і т.д. - так що має сенс дозволити адміністраторам бачити ці файли (для підтримки конфігурації або пошуку прихованої зловмисної програми тощо) .
Луань

23
Довідка для коментаря Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (в якій Роб Пайк пояснює, що приховування "точкових файлів" починається як помилка).
nibot

2
З обгрунтування POSIX: "Деякі історичні реалізації утиліти ls показують усі записи в каталозі, крім крапки та крапки, коли суперпользователь викликає ls, не вказуючи параметр -a. Коли" звичайні "користувачі викликають ls, не вказуючи -a, вони не повинен бачити інформацію про файли з іменами, що починаються з <period>, якщо вони не були названі як операнди файлів. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..

Це набагато старше. Я думаю, що це передувало розбиттю SysV-BSD, коли в останній раз я мав доступ до систем SysV.
Джошуа

3
епічна відповідь. історія вивчена!
Корі Голдберг

15

Ось посилання на вихідний код. Примітка /* Root is -A automatically. */. Це особливість у версії BSD від Apple ls.


Цікава знахідка. Чи існує також спосіб придушити приховані файли під час виконання ls?
Містер Лістер,

5
Гм, схоже, це не особливість Apple, але вона походить із світу BSD?
кірелагін

2
Правильно, це не конкретно для Apple. Дякую за вашу відповідь, це поставило мене на правильний шлях. Я використовував Root is -A automaticallyрядок для пошуку підказок.
kirelagin

Містер Лістер: ви можете придушити відображення точкових файлів як root з -I (з великим капіталом i) у багатьох операційних системах (FreeBSD, так що, мабуть, і OS X)
Аллан Джуд,

1

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


Звучить розумно (навіть якщо перетворення файлу у крапковий файл - це сумнівний спосіб «приховати» його). Було б чудово знайти ці архіви.
kirelagin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.