Pada OS X, mengapa `sudo ls` menampilkan file tersembunyi (titik)?

162

Dengan OS X Yosemite, menggunakan perintah berikut, saya mendapatkan yang berikut:

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

Ini menunjukkan file tersembunyi (yang memiliki nama dimulai dengan titik) ketika dipanggil oleh root dan tidak menunjukkan mereka (seperti yang diharapkan) saat berjalan sebagai pengguna normal. Ini berbeda dari apa yang lsdi Linux (yang berasal dari coreutils) tidak.

Mengapa lsberperilaku seperti ini?

Kiragagin
sumber
141
Saya salah membaca tag itu sebagai "OSX buruk" dan menjadi sangat bingung.
Raystafarian
5
Akan lebih membingungkan jika tag diizinkan dalam huruf besar, BSDdan OSXlebih sesuai di sini.
ryenus
@Raystafarian cukup lucu, karena biasanya sebaliknya, orang mencoba menulis kalimat dengan tag.
Braiam

Jawaban:

404

Ternyata fitur ini tidak spesifik untuk Apple. Ini adalah fitur sistem BSD secara umum.

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

Awalnya, saya bisa melacaknya kembali ke sumber 4.4BSD-Lite . Sudah ada dalam komitmen FreeBSD ini sejak tahun 1994 yang mengimpor sumber-sumber tersebut.

Fitur ini juga hadir di OpenBSD dan dapat ditemukan di komit ini dari tahun 1995 yang mengklaim akan mengimpor kode dari NetBSD, jadi ini sudah ada di NetBSD .

Kemudian seseorang menemukan komitmen NetBSD dari tahun 1993 yang mengklaim akan mengimpor kode dari 386BSD , dan fitur tersebut sudah ada di sana . Lebih jauh, komit ini menunjukkan bahwa itu ada di sana selama pengembangan versi 386BSD 0.0 pada tahun 1991 yang bercabang dari BSD sekitar 4.3, sejauh yang saya tahu.

Komentar tersebut muncul untuk pertama kalinya selama pengembangan 4.3BSD-Reno dalam komit ini (27 Juni 1989) berjudul "versi pertama yang berfungsi dari ls baru". Komentar asli mengatakan:

/* root sees all files automatically */

yang diubah kemudian hari itu (saya tidak yakin cap waktu sepenuhnya benar dalam repositori ini) menjadi:

/* root is -A automatically */

Dan hanya pada tahun 1992 huruf kapital dan periode ditambahkan mengubah komentar menjadi apa yang kita miliki sekarang:

/* Root is -A automatically. */

Tetapi perilaku itu hadir di 2BSD pada 9 Mei 1979 seperti yang terlihat dalam cuplikan ini :

Aflg = getuid() == 0;

Saya tidak dapat menemukan riwayat sebenarnya dari masa-masa itu, tetapi ada juga cuplikan 1BSD dari 1977 tanpa garis-garis itu. Dan tanpa -Abendera sebenarnya.

Jadi sepertinya fitur tersebut diperkenalkan di suatu tempat antara November 1977 (1BSD sedang dikembangkan saat itu) dan rilis 2BSD pada Mei 1979.


Apa yang juga saya temukan selama investigasi ini, adalah -Ibendera yang ditambahkan ke FreeBSD pada tahun 2005 untuk mengesampingkan perilaku ini dan dikerjakan ulang sedikit kemudian.

Kiragagin
sumber
52
Juga, mungkin perlu dicatat bahwa "fitur" menyembunyikan file dengan memulainya dengan .bug sederhana - lshanya seharusnya menyembunyikan .direktori, tidak semuanya dimulai dengan .. Maju cepat selama beberapa dekade, dan biasanya digunakan untuk menyembunyikan file berbahaya dll., Sementara juga digunakan untuk menyembunyikan konfigurasi sistem dll. - jadi masuk akal untuk membiarkan admin melihat file-file tersebut (untuk mempertahankan konfigurasi atau menemukan malware tersembunyi dll.) .
Luaan
23
Referensi untuk komentar Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (di mana Rob Pike menjelaskan bahwa menyembunyikan "file dot" dimulai sebagai bug).
nibot
2
Dari POSIX Rationale, "Beberapa implementasi historis utilitas ls menampilkan semua entri dalam direktori kecuali titik dan titik-titik ketika superuser memanggil ls tanpa menentukan opsi -a. Ketika pengguna" normal "memanggil ls tanpa menentukan -a, mereka seharusnya tidak melihat informasi tentang file apa pun dengan nama yang diawali dengan <period> kecuali mereka dinamai sebagai operan file. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
Jauh lebih tua. Saya pikir itu mendahului perpecahan SysV-BSD sebagai terakhir kali saya memiliki akses ke sistem SysV perilaku yang sama persis hadir.
Joshua
3
jawaban epik. belajar sejarah!
Corey Goldberg
15

Berikut tautan ke kode sumber. Catatan /* Root is -A automatically. */. Ini adalah fitur BSD versi Apple ls.

fd0
sumber
Temuan yang menarik. Apakah ada juga cara untuk menekan file tersembunyi saat melakukan ls?
Mr Lister
5
Hm, sepertinya ini bukan fitur khusus Apple, tetapi berasal dari dunia BSD?
kirelagin
2
Benar, itu tidak spesifik untuk Apple. Terima kasih atas jawaban Anda, ini menempatkan saya di jalur yang benar. Saya menggunakan Root is -A automaticallystring untuk mencari petunjuk.
kirelagin
Mr Lister: Anda dapat menekan tampilan file dot sebagai root dengan -I (huruf besar) pada banyak sistem operasi (FreeBSD, jadi mungkin OS X juga)
Allan Jude
1

IIRC, ada utas tentang hal ini di masa-masa awal Usenet (awal 80-an). Fitur ini ditambahkan sebagai tindakan pencegahan keamanan sehingga pengguna jahat tidak dapat dengan mudah menyembunyikan file / direktori / executable dari sysadmin / root. Teorinya pada dasarnya adalah "root memiliki akses ke semuanya sehingga harus bisa melihat semuanya".

tachijuan
sumber
Kedengarannya masuk akal (meskipun mengubah file menjadi dot-file adalah cara yang “dipertanyakan” untuk menyembunyikannya). Akan bagus untuk menemukan arsip-arsip itu.
kirelagin