Tutoriel Linux

Mktemp Linux : criar um arquivo temporário seguro

Débutant3 min de lecture

Um script que escreve em /tmp/relatorio.txt acaba criando um problema: outro lançamento pode já estar usando esse nome, e um usuário local pode preparar um link simbólico em seu lugar. mktemp cria o arquivo ou diretório com um nome imprevisível e o reserva imediatamente para o script.

Use um arquivo temporário para uma saída intermediária e, em seguida, limpe-o com trap. O script mantém assim seu diretório limpo mesmo em caso de erro ou interrupção.

Diretório temporário seguro em um ambiente Linux
Um diretório temporário criado para o script e, em seguida, limpo adequadamente.

Não crie o nome com $$

Esse antigo hábito continua arriscado:

tmp="/tmp/relatorio-$$.txt"
echo "resultado" > "$tmp"

O PID não torna o nome secreto e o arquivo não é criado no momento em que você o calcula. Entre a construção do caminho e a gravação, outro processo pode ocupar esse nome. mktemp cria o objeto antes de retornar seu caminho.

tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" relatorio.XXXXXX) || exit 1
printf '%sn' "resultado" > "$tmp_file"

O modelo deve conter pelo menos três X consecutivos em seu último componente. Os caracteres são substituídos durante a criação. Sempre mantenha as aspas em torno da variável: TMPDIR pode conter um espaço.

Criar um diretório temporário para vários arquivos

Um diretório temporário evita dispersar vários arquivos em /tmp. Isso é útil para um arquivo a ser preparado, uma conversão ou um relatório que produz arquivos intermediários.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" backup.XXXXXX) || exit 1
printf '%sn' "dados" > "$workdir/lista.txt"
tar -czf "$workdir/relatorio.tar.gz" "$workdir/lista.txt"

A maioria dos sistemas cria esse diretório com permissões restritas à sua conta. Verifique isso quando o script manipula uma chave, uma exportação ou um arquivo contendo dados sensíveis:

stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"

Limpar com trap sem apagar um caminho errado

Defina a função de limpeza logo após a criação do diretório. Verifique se a variável existe e se ela realmente aponta para o diretório esperado antes de chamar rm -rf.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" meu-script.XXXXXX) || exit 1
cleanup() {
  [ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM

# processamento do script aqui

trap ... EXIT inicia a limpeza quando o shell termina. Os sinais HUP, INT e TERM cobrem as interrupções habituais. Uma parada abrupta com kill -9 não dá ao shell tempo para executar essa função, portanto, é necessário também prever uma limpeza controlada para os processos pesados.

  • crie o caminho com mktemp, nunca com uma data ou $$;
  • use mktemp -d se o script produzir vários arquivos;
  • exclua apenas uma variável criada e verificada pelo script;
  • mantenha o arquivo temporário se você precisar diagnosticar uma falha e, depois, exclua-o após a análise.

O guia sobre o histórico do Bash ajuda a evitar que uma senha dada em uma linha de comando permaneça em ~/.bash_history. Para arquivar o resultado final, consulte também criar e extrair um arquivo tar no Linux.

sudo apt update && sudo apt upgrade