En OS X, ¿por qué `sudo ls` muestra archivos ocultos (punto)?

162

Con OS X Yosemite, usando los siguientes comandos, obtengo lo siguiente:

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

Muestra archivos ocultos (que tienen nombres que comienzan con un punto) cuando los invoca la raíz y no los muestra (como se esperaba) cuando se ejecuta como un usuario normal. Esto difiere de lo que hace lsen Linux (el que viene coreutils).

¿Por qué se lscomporta de esta manera?

kirelagin
fuente
141
Leí mal esas etiquetas como "OSX es malo" y me confundí mucho.
Raystafarian
55
Sería menos confuso si las etiquetas se permiten en mayúsculas BSDy OSXson más apropiadas aquí.
ryenus
@Raystafarian es bastante divertido, porque normalmente es al revés, la gente intenta escribir oraciones con etiquetas.
Braiam

Respuestas:

404

Resulta que esta característica no es específica de Apple. Esta es una característica de los sistemas BSD en general.

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

Inicialmente, pude rastrearlo hasta las fuentes de 4.4BSD-Lite . Ya estaba presente en este compromiso de FreeBSD de 1994 que está importando esas fuentes.

La característica también está presente en OpenBSD y se puede encontrar en esta confirmación de 1995 que afirma importar código de NetBSD, por lo que ya estaba presente en NetBSD .

Luego, uno descubre la confirmación de NetBSD desde 1993 que dice importar código desde 386BSD , y la función ya está allí . Además, esta confirmación muestra que estuvo allí durante el desarrollo de 386BSD versión 0.0 en 1991, que se bifurcó de BSD alrededor de 4.3, por lo que puedo decir.

El comentario apareció por primera vez durante el desarrollo de 4.3BSD-Reno en este commit (27 de junio de 1989) titulado "primera versión funcional de nuevos ls". El comentario original decía:

/* root sees all files automatically */

que se cambió más tarde ese día (sin embargo, no estoy seguro de que las marcas de tiempo sean completamente correctas en este repositorio) para:

/* root is -A automatically */

Y solo en 1992 se agregaron la letra mayúscula y el período convirtiendo el comentario en lo que tenemos ahora:

/* Root is -A automatically. */

Pero el comportamiento estaba presente en 2BSD a partir del 9 de mayo de 1979 como se ve en esta instantánea :

Aflg = getuid() == 0;

No puedo encontrar ninguna historia real de esos tiempos, pero también hay esta instantánea de 1BSD de 1977 sin esas líneas. Y sin la -Abandera en realidad.

Parece que la característica se introdujo en algún lugar entre noviembre de 1977 (1BSD se estaba desarrollando en ese momento) y el lanzamiento de 2BSD en mayo de 1979.


Lo que también encontré durante esta investigación es la -Ibandera que se agregó a FreeBSD en 2005 para anular este comportamiento y se modificó un poco más tarde.

kirelagin
fuente
52
Además, puede valer la pena señalar que la "característica" de ocultar archivos al comenzar con ellos .era un simple error: lssolo se suponía que ocultaba el .directorio, no todo comenzaba con .. Avance rápido algunas décadas, y se usa comúnmente para ocultar archivos peligrosos, etc., mientras que también se usa para ocultar la configuración del sistema, etc., por lo que tiene sentido permitir que los administradores vean esos archivos (para mantener la configuración o encontrar malware oculto, etc.) .
Luaan
23
Referencia para el comentario de Luaan : plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (en el que Rob Pike explica que ocultar "archivos de puntos" comenzó como un error).
nibot
2
Desde la justificación de POSIX, "Algunas implementaciones históricas de la utilidad ls muestran todas las entradas en un directorio excepto punto y punto-punto cuando un superusuario invoca ls sin especificar la opción -a. Cuando los usuarios" normales "invocan ls sin especificar -a, ellos no debería ver información sobre ningún archivo con nombres que comiencen con un <período> a menos que hayan sido nombrados como operandos de archivo ". pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
Es mucho más viejo. Creo que es anterior a la división SysV-BSD, ya que la última vez que tuve acceso a los sistemas SysV, el mismo comportamiento estaba presente.
Joshua
3
respuesta épica historia aprendida!
Corey Goldberg
15

Aquí hay un enlace al código fuente. Nota /* Root is -A automatically. */. Esta es una característica en la versión de BSD de Apple ls.

fd0
fuente
Interesante hallazgo. ¿Existe también una forma de suprimir archivos ocultos al hacer un ls?
Sr. Lister
55
Hm, parece que esta no es una característica específica de Apple, pero ¿proviene del mundo BSD?
kirelagin
2
Correcto, no es específico de Apple. Gracias por su respuesta, me puso en el camino correcto. Usé la Root is -A automaticallycadena para buscar pistas.
kirelagin
Sr. Lister: puede suprimir la visualización de los archivos de puntos como root con -I (capital i) en muchos sistemas operativos (FreeBSD, por lo que probablemente también OS X)
Allan Jude
1

IIRC, hubo un hilo sobre esto en los primeros días de Usenet (principios de los 80). La función se agregó como medida de seguridad para que los usuarios malintencionados no puedan ocultar fácilmente archivos / directorios / ejecutables desde el administrador del sistema / root. La teoría era básicamente "la raíz tiene acceso a todo, por lo que debería poder ver todo".

tachijuan
fuente
Suena razonable (aunque convertir un archivo en un archivo de puntos es una forma cuestionable de "ocultarlo"). Sería genial encontrar esos archivos.
kirelagin