Su OS X, perché `sudo ls` mostra file nascosti (punto)?


162

Con OS X Yosemite, usando i seguenti comandi, ottengo quanto segue:

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

Mostra i file nascosti (che hanno nomi che iniziano con un punto) quando vengono invocati da root e non li mostra (come previsto) quando viene eseguito come utente normale. Ciò differisce da quello che fa lssu Linux (quello proveniente da coreutils).

Perché si lscomporta in questo modo?


141
Ho letto male quei tag come "OSX è male" e mi sono davvero confuso.
Raystafarian,

5
Sarebbe meno confuso se i tag sono consentiti in maiuscolo BSDe OSXsono più appropriati qui.
reno il

@Raystafarian è abbastanza divertente, perché normalmente è il contrario, le persone cercano di scrivere frasi con tag.
Braiam,

Risposte:


404

Si scopre che questa funzione non è specifica di Apple. Questa è una caratteristica dei sistemi BSD in generale.

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

Inizialmente, sono stato in grado di risalire alle fonti di 4.4BSD-Lite . Era già presente in questo commit di FreeBSD dal 1994 che sta importando quelle fonti.

La funzione è presente anche in OpenBSD e può essere trovata in questo commit dal 1995 che afferma di importare codice da NetBSD, quindi questo era già presente in NetBSD .

Quindi si scopre il commit di NetBSD dal 1993 che afferma di importare codice da 386BSD e la funzione è già . Inoltre, questo commit mostra che era lì durante lo sviluppo di 386BSD versione 0.0 nel 1991 che è stato biforcuto da BSD intorno alla 4.3, per quanto posso dire.

Il commento è apparso per la prima volta durante lo sviluppo di 4.3BSD-Reno in questo commit (27 giugno 1989) intitolato "prima versione funzionante di nuove LS". Il commento originale diceva:

/* root sees all files automatically */

che è stato modificato più tardi quel giorno (non sono sicuro che i timestamp siano completamente corretti in questo repository) per:

/* root is -A automatically */

E solo nel 1992 la lettera maiuscola e il periodo sono stati aggiunti trasformando il commento in ciò che abbiamo ora:

/* Root is -A automatically. */

Ma il comportamento era presente in 2BSD dal 9 maggio 1979 come visto in questa istantanea :

Aflg = getuid() == 0;

Non riesco a trovare alcuna storia reale di quei tempi, ma c'è anche questa istantanea di 1BSD del 1977 senza quelle righe. E senza la -Abandiera in realtà.

Quindi sembra che la funzionalità sia stata introdotta da qualche parte tra novembre del 1977 (1BSD in fase di sviluppo in quel momento) e l'uscita di 2BSD nel maggio 1979.


Quello che ho anche scoperto durante questa indagine, è la -Ibandiera che è stata aggiunta a FreeBSD nel 2005 per ignorare questo comportamento e che è stata rielaborata un po 'più tardi.


52
Inoltre, potrebbe valere la pena notare che la "caratteristica" di nascondere i file avviandoli con .un semplice bug - lsavrebbe dovuto nascondere solo la .directory, non tutto con cui iniziare .. Avanzamento rapido di alcuni decenni ed è comunemente usato per nascondere file pericolosi ecc., Ma anche per nascondere la configurazione del sistema ecc. - Quindi ha senso lasciare che gli amministratori vedano quei file (per mantenere la configurazione o trovare malware nascosto ecc.) .
Luaan,

23
Riferimento per il commento di Luaan : plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (in cui Rob Pike spiega che nascondere "file di punti" è iniziato come un bug).
nibot,

2
Dalla logica POSIX, "Alcune implementazioni storiche dell'utilità ls mostrano tutte le voci in una directory tranne punto e punto-punto quando un superutente invoca ls senza specificare l'opzione -a. Quando gli utenti" normali "invocano ls senza specificare -a, essi non dovrebbero visualizzare informazioni su alcun file con nomi che iniziano con un <periodo> a meno che non siano stati nominati come operandi di file. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..

È molto più vecchio. Penso che preceda la divisione SysV-BSD poiché l'ultima volta che ho avuto accesso ai sistemi SysV era presente esattamente lo stesso comportamento.
Giosuè,

3
risposta epica. storia imparata!
Corey Goldberg,

15

Ecco un link al codice sorgente. Nota /* Root is -A automatically. */. Questa è una funzionalità della versione di BSD di Apple ls.


Trova interessante. C'è anche un modo per sopprimere i file nascosti quando si fa un ls?
Lister,

5
Hm, sembra che questa non sia una caratteristica specifica di Apple, ma provenga dal mondo BSD?
Kirelagin,

2
Bene, non è specifico per Apple. Grazie per la tua risposta, mi ha messo sulla strada giusta. Ho usato la Root is -A automaticallystringa per cercare indizi.
Kirelagin,

Signor Lister: è possibile sopprimere la visualizzazione dei file dot come root con -I (maiuscolo i) su molti sistemi operativi (FreeBSD, quindi probabilmente anche OS X)
Allan Jude,

1

IIRC, c'era un filo su questo nei primi giorni di Usenet (primi anni '80). La funzione è stata aggiunta come precauzione di sicurezza in modo che gli utenti malintenzionati non possano facilmente nascondere file / directory / eseguibili dal sysadmin / root. La teoria era fondamentalmente "root ha accesso a tutto, quindi dovrebbe essere in grado di vedere tutto".


Sembra ragionevole (anche se trasformare un file in file dot è un modo discutibile di "nasconderlo"). Sarebbe bello trovare quegli archivi.
Kirelagin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.