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


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 los archivos ocultos (que tienen nombres que comienzan con un punto) cuando los invoca el administrador y no los muestra (como se esperaba) cuando se ejecuta como un usuario normal. Esto difiere de lo que ls en Linux (el que viene de coreutils) hace.

Por que ls ¿comportarse de esta manera?


160


origen


Leí mal esas etiquetas ya que "OSX es malo" y me confundí mucho. - Raystafarian
Sería menos confuso si las etiquetas están permitidas en mayúsculas, BSD y OSXson más apropiados aquí. - ryenus
@Raystafarian bastante divertido, porque normalmente es al revés, la gente trata de escribir oraciones con etiquetas. - Braiam


Respuestas:


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 commit de FreeBSD desde 1994 que está importando esas fuentes.

La característica también está presente en OpenBSD y se puede encontrar en este compromiso desde 1995 que dice estar importando código de NetBSD, entonces esto ya estaba presente en NetBSD.

Entonces uno descubre el compromiso de NetBSD desde 1993 que dice estar importando código de 386BSD, y la característica ya está ahí. Además, este compromiso muestra que estuvo allí durante el desarrollo de la versión de 386BSD 0.0 en 1991 que 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 compromiso (27 de junio de 1989) titulado "primera versión de trabajo de nueva ls". El comentario original dijo:

/* root sees all files automatically */

que era cambiado más tarde ese día (No estoy seguro si las marcas de tiempo son completamente correctas en este repositorio, sin embargo) para:

/* root is -A automatically */

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

/* Root is -A automatically. */

Pero el comportamiento estaba presente en 2BSD desde el 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 desde 1977 sin esas líneas Y sin el -A bandera en realidad.

Así que parece que la función se introdujo en algún momento entre noviembre de 1977 (1BSD se desarrolló en ese momento) y el lanzamiento de 2BSD en mayo de 1979.


Lo que también encontré durante esta investigación, es el -I bandera que fue añadido a FreeBSD en 2005 para anular este comportamiento y fue reelaborado un poco tarde.


405



Además, podría valer la pena señalar que la "característica" de ocultar archivos al iniciarlos con . era un error simple ls solo se suponía que ocultara el . directorio, no todo comienza con .. Avance rápido algunas décadas, y se usa comúnmente para ocultar archivos peligrosos, etc., mientras 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 buscar malware oculto, etc.) . - Luaan
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
Desde POSIX Rational, "Algunas implementaciones históricas de la utilidad ls muestran todas las entradas en un directorio excepto punto y punto cuando un superusuario invoca ls sin especificar la opción -a. Cuando los usuarios" normales "invocan ls sin especificar -a, no debería ver información sobre ningún archivo con nombres que comiencen con un <período> a menos que se hayan nombrado como operandos de archivo ". pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html - R..
Es mucho más antiguo. Creo que es anterior a la división SysV-BSD ya que la última vez que tuve acceso a los sistemas SysV estaba presente el mismo comportamiento. - Joshua
respuesta épica. historia aprendida! - Corey Goldberg


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


15



Hallazgo interesante ¿También hay una manera de suprimir los archivos ocultos al hacer un ls? - Mr Lister
Hm, parece esta no es una característica específica de Apple, pero viene del mundo BSD? - kirelagin
Correcto, no es específico de Apple. Gracias por su respuesta, me puso en el camino correcto. Usé el Root is -A automatically cadena para buscar pistas. - kirelagin
Sr. Lister: puede suprimir la visualización de los archivos de puntos como raíz con -I (capital i) en muchos sistemas operativos (FreeBSD, probablemente también OS X) - Allan Jude


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


1



Suena razonable (incluso si convertir un archivo en un archivo de puntos es una manera cuestionable de "ocultarlo"). Sería genial encontrar esos archivos. - kirelagin