Use o formato mktemp
utilitário para criar um arquivo temporário com um nome imprevisível. Não é padronizado pelo POSIX, mas está disponível no * BSD assim como no Linux.
> /tmp/predictable.$RANDOM
não é uma boa escolha porque é mais previsível¹, o que abre seu script para um ataque em que o invasor pode enganar seu script para sobrescrever um arquivo ao qual você tem acesso de gravação ou conceder acesso ao arquivo temporário. Esta é uma vulnerabilidade arquivo temporário inseguro . mktemp
não possui esta vulnerabilidade porque cria o arquivo com segurança (ele não substituirá um arquivo existente, mesmo se links simbólicos estiverem envolvidos) e usa um nome suficientemente imprevisível para evitar uma negação de serviço.
Se criar um arquivo temporário e trabalhar com ele não for suficiente, crie um diretório temporário com mktemp -d
e trabalhe nele.
mktemp
também toma o cuidado de usar $TMPDIR
se a variável estiver definida, voltando a /tmp
se não estiver definida.
Mais e mais distribuições configuram TMPDIR
para ser um diretório privado, por exemplo, /run/1234/tmp
onde 1234
é seu UID. Isso elimina o risco de vulnerabilidades de arquivos temporários, ao custo de não poder mais compartilhar arquivos temporários entre usuários (o que ocasionalmente é útil, mas não com muita frequência; /tmp
ainda está disponível, apenas não TMPDIR
).
Se você precisar de um nome de arquivo reproduzível, crie um arquivo com um nome bem definido (sem componente aleatório) no diretório inicial do usuário. A convenção moderna é a especificação do diretório de usuários XDG . Se o arquivo puder ser removido sem causar perda de dados, use a variável de ambiente XDG_CACHE_HOME
, com o padrão ~/.cache
. Você provavelmente deve criar um subdiretório com o nome do seu aplicativo e trabalhar nele.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹ Não só $RANDOM
leva apenas 32767 valores possíveis, mas é fácil de prever sem tentar muitos valores. O gerador de números aleatórios do Bash é um LCG criado pelo PID e pela hora do primeiro uso. O Zsh's é o rand
da plataforma com o tempo de inicialização. ATT Ksh's é o rand
da plataforma semeado pelo PID. O Mksh's é um LCG com uma semente mais complexa, mas ainda sem qualidade de segurança. Todos eles podem ser previstos por outro processo com uma chance bastante grande de sucesso.