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


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 que começam com um ponto) quando chamados pelo root e não os mostram (como esperado) quando são executados como usuários normais. Isso difere do que ls no Linux (o que vem de coreutils) faz.

Porque ls se comportar assim?


160


origem


Eu interpretei mal essas tags como "OSX é ruim" e fiquei muito confuso. - Raystafarian
Seria menos confuso se as tags fossem permitidas em maiúsculas BSD e OSXsão mais apropriados aqui. - ryenus
@Raystafarian muito engraçado, porque normalmente é o contrário, as pessoas tentam escrever frases com tags. - Braiam


Respostas:


Acontece que esse recurso não é específico da Apple. Esta é uma característica dos sistemas BSD em geral.

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

Inicialmente, fui capaz de rastreá-lo de volta para as fontes de 4.4BSD-Lite. Já estava presente em este commit do FreeBSD de 1994, que está importando essas fontes.

O recurso também está presente no OpenBSD e pode ser encontrado em este commit de 1995 que afirma estar importando código do NetBSD, então isso já estava presente em NetBSD.

Então descobre-se o commit do NetBSD de 1993 que alega estar importando código de 386BSD, e o recurso já está . Além disso, este commit mostra que esteve lá durante o desenvolvimento da versão 0.0 do 386BSD em 1991 que bifurcou do BSD em torno de 4.3, até onde eu posso dizer.

O comentário apareceu pela primeira vez durante o desenvolvimento de 4.3BSD-Reno dentro este commit (27 jun 1989) intitulado "primeira versão de trabalho do novo ls". O comentário original dizia:

/* root sees all files automatically */

que foi mudou mais tarde naquele dia (Eu não tenho certeza se os timestamps estão totalmente corretos neste repositório, no entanto) para:

/* root is -A automatically */

E somente em 1992 a letra maiúscula e o período foi adicionado 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 em este instantâneo:

Aflg = getuid() == 0;

Não consigo encontrar nenhum histórico real desses tempos, mas também há este instantâneo de 1BSD de 1977 sem essas linhas. E sem o -A bandeira na verdade.

Assim, parece que o recurso foi introduzido em algum lugar entre novembro de 1977 (o 1BSD foi desenvolvido naquele momento) e o lançamento do 2BSD em maio de 1979.


O que eu também encontrei durante esta investigação, é o -I bandeira que foi adicionado para FreeBSD em 2005 para substituir este comportamento e foi retrabalhado um pouquinho mais tarde.


405



Além disso, pode ser interessante notar que o "recurso" de ocultar arquivos, iniciando-os com . foi um bug simples - ls só deveria esconder o . diretório, nem tudo começando com .. Avance algumas décadas e é comumente usado para ocultar arquivos perigosos etc., além de ser usado para ocultar a configuração do sistema, etc. - por isso, faz sentido permitir que os administradores vejam esses arquivos (para manter a configuração ou encontrar malware oculto etc.) . - Luaan
Referência para o comentário de Luaan: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (no qual Rob Pike explica que esconder "arquivos de ponto" começou como um bug). - nibot
No POSIX Rationale, "Algumas implementações históricas do utilitário ls mostram todas as entradas em um diretório, exceto dot e dot-dot quando um superusuário invoca ls sem especificar a opção -a. Quando usuários" normais "invocam ls sem especificar -a, eles não deve ver informações sobre quaisquer arquivos com nomes iniciados por <period>, a menos que tenham sido nomeados como operandos de arquivo. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html - R..
É muito mais antigo. Eu acho que antecede a divisão do SysV-BSD como da última vez que tive acesso a sistemas SysV exatamente o mesmo comportamento estava presente. - Joshua
resposta épica. história aprendida! - Corey Goldberg


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


15



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


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


1



Parece razoável (apesar de transformar um arquivo em arquivo de pontos é uma maneira questionável de "escondê-lo"). Seria ótimo encontrar esses arquivos. - kirelagin