No OS X, por que o `sudo ls` mostra arquivos ocultos (pontos)?

162

Com o OS X Yosemite, usando os seguintes comandos, recebo o seguinte:

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

Ele mostra arquivos ocultos (que têm nomes começando com um ponto) quando chamados pelo root e não os mostram (conforme o esperado) quando executados como um usuário normal. Isso difere do que o lsLinux (o que vem coreutils) faz.

Por que lsse comporta dessa maneira?

Kirelagin
fonte
141
Eu interpretei essas tags como "OSX é ruim" e fiquei realmente confuso.
Raystafarian
5
Seria menos confuso se as tags fossem permitidas em maiúsculas BSDe OSXfossem mais apropriadas aqui.
ryenus
@Raystafarian é bem engraçado, porque normalmente é o contrário, as pessoas tentam escrever frases com tags.
Braiam

Respostas:

404

Acontece que esse recurso não é específico da Apple. Esse é um recurso dos sistemas BSD em geral.

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

Inicialmente, eu era capaz de rastreá-lo de volta às fontes do 4.4BSD-Lite . Já estava presente neste commit do FreeBSD de 1994, que está importando essas fontes.

O recurso também está presente no OpenBSD e pode ser encontrado neste commit, de 1995, que afirma estar importando código do NetBSD, portanto, ele já estava presente no NetBSD .

Em seguida, descobrimos o commit do NetBSD de 1993 que afirma estar importando código do 386BSD , e o recurso já está . Além disso, esse commit mostra que ele estava presente durante o desenvolvimento da versão 0.0 do 386BSD em 1991, que saiu do BSD por volta de 4,3, até onde eu sei.

O comentário apareceu pela primeira vez durante o desenvolvimento do 4.3BSD-Reno em este cometer (27 de junho de 1989), intitulado “primeira versão de novos ls de trabalho”. O comentário original dizia:

/* root sees all files automatically */

que foi alterado mais tarde naquele dia (no entanto, não tenho certeza de que os carimbos de data e hora estejam corretos neste repositório) para:

/* root is -A automatically */

E somente em 1992 a letra maiúscula e o período foram adicionados, transformando o comentário no que temos agora:

/* Root is -A automatically. */

Mas o comportamento estava presente no 2BSD a partir de 9 de maio de 1979, como visto neste instantâneo :

Aflg = getuid() == 0;

Não consigo encontrar nenhuma história real daqueles tempos, mas também há um instantâneo do 1BSD de 1977 sem essas linhas. E sem a -Abandeira, na verdade.

Parece que o recurso foi introduzido entre novembro de 1977 (1BSD sendo desenvolvido naquele momento) e o lançamento do 2BSD em maio de 1979.


O que eu também descobri durante esta investigação é a -Ibandeira que foi adicionada ao FreeBSD em 2005 para substituir esse comportamento e foi retrabalhada um pouco mais tarde.

Kirelagin
fonte
52
Além disso, pode ser interessante notar que o "recurso" de ocultar arquivos iniciando-os com .um simples bug - lsdeveria apenas ocultar o .diretório, nem tudo o que se inicia .. Avanço rápido por algumas décadas e é comumente usado para ocultar arquivos perigosos etc., além de ser usado para ocultar a configuração do sistema etc. - portanto, faz sentido permitir que os administradores vejam esses arquivos (para manter a configuração ou encontrar malware oculto etc.) .
Luaan
23
Referência para o comentário de Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (em que Rob Pike explica que ocultar "arquivos de ponto" começou como um bug).
Nibot
2
No POSIX Rationale, "Algumas implementações históricas do utilitário ls mostram todas as entradas em um diretório, exceto ponto e ponto-ponto quando um superusuário chama ls sem especificar a opção -a. Quando usuários" normais "chamam ls sem especificar -a, eles não deve ver informações sobre arquivos com nomes começando com um <período>, a menos que tenham sido nomeados como operandos de arquivos ". pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
É muito mais velho. Eu acho que é anterior à divisão SysV-BSD, na última vez que tive acesso aos sistemas SysV, exatamente o mesmo comportamento estava presente.
28715 Joshua
3
resposta épica. história aprendida!
Corey Goldberg
15

Aqui está um link para o código fonte. Nota /* Root is -A automatically. */. Esse é um recurso da versão do BSD da Apple ls.

fd0
fonte
Achado interessante. Existe também uma maneira de suprimir arquivos ocultos ao fazer um ls?
Lister
5
Hm, parece que esse não é um recurso específico da Apple, mas vem do mundo do BSD?
kirelagin
2
Certo, não é específico da Apple. Obrigado pela sua resposta, ele me colocou no caminho certo. Eu usei a Root is -A automaticallystring para procurar pistas.
kirelagin
Sr. Lister: você pode suprimir a exibição dos arquivos do ponto como root com -I (capital i) em vários sistemas operacionais (FreeBSD, então provavelmente OS X também)
Allan Jude
1

IIRC, houve um tópico sobre isso nos primeiros dias da Usenet (início dos anos 80). O recurso foi adicionado como uma precaução de segurança para que usuários mal-intencionados não pudessem ocultar facilmente arquivos / diretórios / executáveis ​​do sysadmin / root. A teoria era basicamente "a raiz tem acesso a tudo, para poder ver tudo".

tachijuan
fonte
Parece razoável (embora transformar um arquivo em arquivo de ponto seja uma maneira questionável de "escondê-lo"). Seria ótimo encontrar esses arquivos.
kirelagin