Significado de @ 0 em um script de shell

6

Eu estava olhando o script /etc/init.d/sudo no meu sistema Linux Ubuntu 14.04. Enquanto lia o script, encontrei esta afirmação:

find /var/lib/sudo -exec touch -d @0 '{}' \;

Qual é o significado de @0 aqui? O que a declaração acima faz?

    
por crisron 08.09.2014 / 16:47

3 respostas

12

Isso não tem nada a ver com bash ou sudo . O comando find está usando a ação -exec para executar o comando especificado em cada arquivo encontrado. Neste caso, o comando que está sendo executado é

touch -d @0

Se você verificar man touch em um sistema GNU, verá que

   -d, --date=STRING
          parse STRING and use it instead of current time

Portanto, o -d é uma maneira de escolher a data em que você deseja que touch seja definido para o arquivo de destino. O @ informa à implementação GNU de touch que esta é uma data definida como segundos desde a época . Como na verdade é 0 segundo, isso significa o início do horário do UNIX. Uma maneira fácil de verificar isso é dar a mesma data ao comando GNU date :

$ TZ=UTC date -d @0
Thu Jan  1 00:00:00 UTC 1970

Assim, o comando que você mostrou encontrará todos os arquivos e diretórios em /var/lib/sudo e definirá sua última data modificada para 00:00 UTC na quinta-feira de janeiro de 1970.

A razão pela qual a linha existe foi bem explicada em os comentários abaixo:

@crisron The purpose of the line is to ensure that all sudo passwords from any previous instance of sudo are expired. The first time a user runs sudo, for each session it'll create a file in that directory. Sudo then checks the time stamp on the file the next time you run it to decide whether or not to ask you for the password again. This line ensures that when the sudo daemon is restarted all passwords must be retyped the next time a user sudos something. – krowe

    
por 08.09.2014 / 16:57
4

Essa linha faz o seguinte:

/ var / lib / sudo define o diretório de trabalho.

-exec touch -d @ 0 '{}' \; é a ação a ser executada. Vamos dividir em partes:

-exec precede a ação real.

touch -d altera a data e a hora do arquivo analisando a sequência de argumentos e usando-a em vez da hora atual.

@ 0 é um timestamp equivalente a:

root@debian:/var/log# date -d @0
Wed Dec 31 21:00:00 ART 1969

O resultado é:

Quando o comando find encontrar um hit, atualize o timestamp para qua 31 de dezembro às 21:00:00 ART 1969.

Espero que ajude.

    
por 08.09.2014 / 17:06
4

@0 é a data da época. E mais geralmente @ x é x segundos após a época. Por exemplo:

$ touch -d @0 foo
$ TZ=UTC0 ls -l foo
-rw-r--r-- 1 vinc17 vinc17 0 1970-01-01 00:00:00 foo

Observação: a opção -d do utilitário touch é especificada pelo POSIX, mas somente com strings em formulários ISO8601 . Outras formas de strings são específicas para cada implementação e, em particular, o formulário @x é uma extensão do GNU.

    
por 08.09.2014 / 16:55

Tags