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

160

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 (como esperado) quando executados como usuário normal. Isso difere do que ls no Linux (o que vem de coreutils ) faz.

Por que o ls se comporta dessa maneira?

    
por kirelagin 23.06.2015 / 17:36

3 respostas

405

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, consegui rastreá-lo de volta às fontes de 4.4BSD-Lite . Ele 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 alega estar importando código do NetBSD, então isso já estava presente no NetBSD .

Então descobre-se o commit do NetBSD de 1993 que afirma estar importando código de 386BSD , e o recurso é já . 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 sei.

O comentário apareceu pela primeira vez durante o desenvolvimento de 4.3BSD-Reno em 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 alterado mais tarde naquele dia (não tenho certeza se o timestamps estão totalmente corretos neste repositório, embora) para:

/* root is -A automatically */

E somente em 1992 a letra maiúscula e o período foram adicionados o comentário para o 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 nenhuma história real desses tempos, mas também há este instantâneo do 1BSD de 1977 sem essas linhas. E sem o sinal -A , 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 sinal -I que foi adicionado ao FreeBSD em 2005 para anular este comportamento e foi reformulado um pouco mais tarde.

    
por 23.06.2015 / 19:53
15

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

    
por 23.06.2015 / 18:03
1

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 facilmente ocultar arquivos / diretórios / executáveis do sysadmin / root. A teoria era basicamente "root tem acesso a tudo para poder ver tudo".

    
por 25.06.2015 / 23:27

Tags