com o que devo me preocupar ao usar o mktemp --dry-run

5

Estou tentando fazer um fifo temporário e depois de fazer referência a Bash: criar um fifo anônimo Eu vejo que eles estão usando mktemp -u para obter o nome do arquivo para o fifo. A página man afirma que isso não é seguro.

-u, --dry-run
       do not create anything; merely print a name (unsafe)

Por que isso é inseguro e como eu uso essa técnica de forma responsável?

    
por Jon 31.10.2014 / 14:43

2 respostas

5

O que eles queriam dizer com "inseguro" acima é o seguinte. Digamos que você tenha este cenário:

  • Você executa mktemp -u
  • Imprime um nome, digamos /tmp/tmp.njxOsokU9u
  • Você salva esse nome em algum lugar, presumivelmente em uma variável bash (por exemplo, tmp )
  • Seu script faz algum trabalho não relacionado a esse arquivo
  • Seu script tenta usar o arquivo temporário ( echo hello > $tmp )

Nada de errado, sim? Aqui está um cenário semelhante:

  • Você executa mktemp -u
  • Imprime um nome, digamos /tmp/tmp.njxOsokU9u
  • Você salva esse nome em algum lugar, presumivelmente em uma variável bash (por exemplo, tmp )
  • Seu script faz algum trabalho não relacionado a esse arquivo
  • Algum outro processo não relacionado ao seu script cria o arquivo com o mesmo nome (por exemplo, /tmp/tmp.njxOsokU9u )
  • Seu script tenta usar o arquivo temporário ( echo hello > $tmp )

Agora, seu script e o outro processo podem estar gravando no mesmo arquivo, o que provavelmente não terminará bem. É por isso que é marcado como inseguro.

    
por 31.10.2014 / 15:58
-1

No contexto de mktemp , "seguro" significa protegido de interferência inadvertida de outros programas, especialmente como resultado de colisão de nomes . O mktemp tenta dar a você alguma garantia de que, mesmo que seu arquivo esteja em um sistema de arquivos compartilhado com inúmeros outros programas, seu script provavelmente será o único interagindo com o arquivo. mktemp lida com isso de três maneiras:

  1. Cria nomes com caracteres aleatórios, portanto, é improvável que eles tenham o mesmo nome que outros programas (ou outras instâncias em execução do mesmo script).
  2. Define as permissões no arquivo para que ele seja legível e gravável por seu proprietário, limitando o número de outros programas que poderiam interrompê-lo.
  3. Verifica se o nome ainda não está em uso. Em outras palavras, verifica se o arquivo ainda não existe.

Uma execução seca do mktemp não pode lidar com permissões para você (# 2), mas é fácil fazer isso com o chmod se você quiser.

O problema que a documentação do mktemp está lhe alertando é o # 3. Embora a invocação do mktemp no script atual garanta que o nome ainda não esteja em uso , ele não comunica isso a outros programas. Portanto, outro programa, ou outra chamada do mesmo script em execução simultaneamente, pode invocar o mktemp novamente e obter o mesmo caminho de arquivo temporário.

A única vez que você pode querer usar mktemp --dry-run é para alguns programas raros que não permitirão que o arquivo ou diretório de saída já exista. Nessas circunstâncias, você pode diminuir a probabilidade de colisão de nomes por meio de:

  1. Aumentando o número de caracteres aleatórios no nome do arquivo (função mktemp nº 1, acima).
  2. Minimize a quantidade de tempo entre a invocação do mktemp e o momento em que o arquivo é criado. Da mesma forma, você pode deixar o mktemp criar o arquivo e excluí-lo antes que outro comando crie um arquivo no caminho temporário.
por 21.09.2018 / 17:45

Tags