De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Criação de arquivos e diretórios temporários com o comando mktemp

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 19 de janeiro de 2015

É uma prática bastante usada criar arquivos e diretórios temporários usando como sufixo a variável "$$", que corresponde ao número do processo sob o qual o script está sendo executado.

O problema é que esta forma de criar os arquivos temporários é facilmente previsível e pode causar uma condição de concorrência (race condition), em que um potencial invasor pode criar um link simbólico de tal forma que quando o script abrir um arquivo supostamente não usado, poderá modificar um arquivo já existente.

Scripts modernos, ao invés de utilizar esta forma de notação para arquivos e diretórios temporários, devem usar o comando mktemp para garantir que o nome gerado seja não previsível e que o conhecimento do arquivo temporário implique que o arquivo foi criado pelo processo corrente e não pode ser modificado por outros usuários.

Ao criar um arquivo com o comando mktemp, o arquivo resultante é criado com um nome aleatório, não previsível, e tem permissões de leitura e gravação apenas para o usuário corrente e nenhuma permissão para o grupo ou os demais usuários. Estas permissões podem ser ainda mais restritivas se a definição umask assim o estabelecer.

Vejamos alguns exemplos:

  $ mktemp
  /tmp/tmp.ZxfjiccK9j
  $ ls -l /tmp/tmp.ZxfjiccK9j
  -rw------- 1 queiroz queiroz 0 Jan 18 19:36 /tmp/tmp.ZxfjiccK9j

No exemplo acima, o comando mktemp foi invocado diretamente, sem a especificação de qualquer diretiva. O arquivo foi criado no diretório /tmp, com permissão de leitura e gravação apenas para o dono do processo (queiroz).

Podemos também criar arquivos temporários seguindo um modelo (TEMPLATE). O modelo deve incluir ao menos três letras X consecutivas. Caso o modelo não seja fornecido, o padrão é usar na formação do nome dez letras aleatórias, como mostrado no exemplo anterior.

Mais alguns exemplos:

  1. Criar um arquivo temporário no diretório corrente:
      $ mktemp file.XXXX
      file.H47c
    

  2. Criar um arquivo temporário com um sufixo conhecido:

      $ mktemp --suffix=.txt file-XXXX
      file-H08W.txt
      $ mktemp file-XXXX-XXXX.txt
      file-XXXX-eI9L.txt
    

  3. Criar um diretório temporário:

      $ mktemp -d
      /tmp/tmp.uEEFFKq8Na
      $ ls -ld /tmp/tmp.uEEFFKq8Na
      drwx------ 2 queiroz queiroz 4096 Jan 18 19:43 /tmp/tmp.uEEFFKq8Na
    

As mesmas regras para formação de nomes de arquivos temporários também se aplicam à criação de diretórios. Como podemos ver a partir dos exemplos, o nome do arquivo ou diretório criado é ecoado para a tela. Para uso em scripts o nome deste arquivo ou diretório deverá ser salvo em uma variável.

  TempDir=`mktemp -d`
  $ echo $TempDir
  /tmp/tmp.nxU3HDjxpQ

Esta dica foi criada em grande parte a partir da tradução de trechos da documentação do programa mktemp (info mktemp).

Saiba mais

Why do we need mktemp?

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida