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.
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:
$ mktemp file.XXXX file.H47c
$ mktemp --suffix=.txt file-XXXX file-H08W.txt $ mktemp file-XXXX-XXXX.txt file-XXXX-eI9L.txt
$ 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).
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários