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?


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.


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.


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ć”.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.