Dlaczego w systemie OS X `sudo ls` pokazuje ukryte pliki (kropki)?

162

W systemie OS X Yosemite za pomocą następujących poleceń otrzymuję:

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

Pokazuje ukryte pliki (których nazwy zaczynają się od kropki), gdy są wywoływane przez root i nie pokazuje ich (zgodnie z oczekiwaniami), gdy działa jako zwykły użytkownik. Różni się to od tego, co robi lsLinux (ten pochodzący coreutils).

Dlaczego tak się lszachowuje?

kirelagin
źródło
141
Źle odczytałem te tagi, ponieważ „OSX jest zły” i bardzo się zdezorientowałem.
Raystafarian
5
Byłoby mniej mylące, gdyby tagi były dozwolone dużymi literami BSDi OSXsą bardziej odpowiednie tutaj.
ryenus
@Raystafarian jest dość zabawny, ponieważ zwykle jest na odwrót, ludzie próbują pisać zdania z tagami.
Braiam

Odpowiedzi:

404

Okazuje się, że ta funkcja nie jest specyficzna dla Apple. Jest to ogólna cecha systemów BSD.

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

Początkowo byłem w stanie prześledzić go z powrotem do źródeł 4.4BSD-Lite . Był już obecny w tym zatwierdzeniu FreeBSD z 1994 roku, który importuje te źródła.

Ta funkcja jest również obecna w OpenBSD i można ją znaleźć w tym zatwierdzeniu z 1995 roku, które twierdzi, że importuje kod z NetBSD, więc było to już obecne w NetBSD .

Następnie odkrywa się zatwierdzenie NetBSD z 1993 roku, które twierdzi, że importuje kod z 386BSD , a funkcja jest już dostępna . Co więcej, to zatwierdzenie pokazuje, że istniało ono podczas rozwoju wersji 386BSD 0.0 w 1991 roku, która rozwinęła się z BSD około 4.3, o ile wiem.

Komentarz pojawił się po raz pierwszy podczas opracowywania wersji 4.3BSD-Reno w tym zatwierdzeniu (27 czerwca 1989 r.) Zatytułowanym „pierwsza działająca wersja nowego ls”. Oryginalny komentarz brzmiał:

/* root sees all files automatically */

który został zmieniony później tego samego dnia (nie jestem jednak pewien, czy znaczniki czasu są w tym repozytorium całkowicie poprawne), aby:

/* root is -A automatically */

Dopiero w 1992 r. Dodano wielką literę i kropkę , zmieniając komentarz w to, co mamy teraz:

/* Root is -A automatically. */

Ale zachowanie było obecne w 2BSD od 9 maja 1979 r., Jak widać na tej migawce :

Aflg = getuid() == 0;

Nie mogę znaleźć żadnej faktycznej historii z tamtych czasów, ale jest też migawka 1BSD z 1977 roku bez tych linii. I -Awłaściwie bez flagi.

Wygląda więc na to, że funkcja została wprowadzona gdzieś między listopadem 1977 r. (1BSD jest w tym momencie opracowywana) a wydaniem 2BSD w maju 1979 r.


Podczas tego dochodzenia odkryłem także -Iflagę, która została dodana do FreeBSD w 2005 roku w celu zastąpienia tego zachowania i została przerobiona nieco później.

kirelagin
źródło
52
Warto również zauważyć, że „funkcja” ukrywania plików przez uruchomienie ich .była prostym błędem - lsmiała jedynie ukryć .katalog, a nie wszystko, począwszy od .. Przewiń do przodu o kilka dekad i jest powszechnie używany do ukrywania niebezpiecznych plików itp., A jednocześnie służy do ukrywania konfiguracji systemu itp. - więc sensownie jest pozwolić administratorom zobaczyć te pliki (w celu utrzymania konfiguracji lub znalezienia ukrytego złośliwego oprogramowania itp.) .
Luaan
23
Odniesienie do komentarza Luaana: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (w którym Rob Pike wyjaśnia, że ​​ukrywanie „plików kropek” zaczęło się jako błąd).
nibot
2
Z uzasadnienia POSIX: „Niektóre historyczne implementacje narzędzia ls pokazują wszystkie wpisy w katalogu oprócz kropek i kropek, gdy superużytkownik wywołuje ls bez określania opcji -a. Kiedy„ normalni ”użytkownicy wywołują ls bez podawania -a, nie powinien widzieć informacji o żadnych plikach o nazwach rozpoczynających się od <okres>, chyba że zostały one nazwane jako operandy plików. ” pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
Jest znacznie starszy. Myślę, że poprzedza podział SysV-BSD, ponieważ kiedy ostatnio miałem dostęp do systemów SysV, było dokładnie takie samo zachowanie.
Joshua
3
epicka odpowiedź. historia się nauczyła!
Corey Goldberg,
15

Oto link do kodu źródłowego. Uwaga /* Root is -A automatically. */. Jest to funkcja w wersji BSD firmy Apple ls.

fd0
źródło
Ciekawe znalezisko. Czy istnieje również sposób na ukrycie ukrytych plików podczas wykonywania ls?
Pan Lister
5
Hm, wygląda na to , że nie jest to funkcja specyficzna dla Apple, ale pochodzi ze świata BSD?
kirelagin
2
Racja, nie jest specyficzna dla Apple. Dzięki za odpowiedź, postawiłem mnie na właściwej drodze. Użyłem Root is -A automaticallyciągu, aby wyszukać wskazówki.
kirelagin
Pan Lister: możesz ukryć wyświetlanie plików kropek jako root za pomocą -I (capital i) na wielu systemach operacyjnych (FreeBSD, więc prawdopodobnie także OS X)
Allan Jude
1

IIRC, był wątek na ten temat we wczesnych dniach Usenetu (wczesne lata 80-te). Ta funkcja została dodana jako środek bezpieczeństwa, aby złośliwi użytkownicy nie mogli łatwo ukryć plików / katalogów / plików wykonywalnych przed sysadmin / root. Teoria była w zasadzie „root ma dostęp do wszystkiego, więc powinien móc wszystko widzieć”.

tachijuan
źródło
Brzmi rozsądnie (nawet jeśli przekształcenie pliku w plik kropkowy jest wątpliwym sposobem „ukrywania” go). Byłoby wspaniale znaleźć te archiwa.
kirelagin