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: outra execução 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 o 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 então limpe-o com trap. O script mantém assim seu diretório limpo mesmo em caso de erro ou interrupção.

Pasta temporária segura em um ambiente Linux
Uma pasta temporária criada para o script e então limpa corretamente.

Não crie o nome com $$

Esse velho 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 escrita, 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. Mantenha sempre as aspas em torno da variável: TMPDIR pode conter um espaço.

Criar uma pasta temporária para vários arquivos

Uma pasta temporária evita espalhar vários arquivos em /tmp. Isso é útil para um arquivo a preparar, 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 direitos reservados à sua conta. Verifique isso quando o script manipular 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 da pasta. Verifique se a variável existe e se 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 brusca com kill -9 não dá ao shell tempo para executar essa função, portanto, também é necessário prever uma limpeza controlada para os grandes processamentos.

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

O guia sobre o histórico do Bash ajuda a evitar que uma senha passada em uma linha de comando fique 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