O local de jure para arquivos temporários é dado na variável de ambiente TMPDIR
.
This variable shall represent a pathname of a directory made available for programs that need a place to create temporary files.
De fato, muitos sistemas não definem TMPDIR
. O local padrão de fato para arquivos temporários é /tmp
. Portanto, verifique TMPDIR
e, se não estiver definido, use /tmp
. Em um script de shell, você pode usar ${TMPDIR:-/tmp}
ou, se achar mais conveniente,
if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi
ou para lidar com set -u
: "${TMPDIR:=/tmp}"
Você pode assumir que esse local é gravável, mas pode ser legível por todos e ser mundialmente editável, portanto:
- Ao criar um arquivo normal, sempre certifique-se de não estar sobrescrevendo um arquivo existente, que pode não pertencer a você. Não use um redirecionamento de shell para isso. Não é seguro testar a propriedade separadamente porque um adversário pode mover links simbólicos enquanto seu programa está sendo executado para enganar as verificações. Além disso, você não pode confiar em um nome específico que não exista; Para evitar que um programa concorrente crie uma negação de serviço criando um arquivo com o mesmo nome antes de você, use um nome aleatório. Você pode usar o utilitário
mktemp
(generalizado, presente no GNU, BusyBox, BSD, mas não POSIX) ou a função de bibliotecamkstemp
C. Sob o capô,open
oucreat
deve ser chamado com o sinalizadorO_EXCL
. - Você pode criar um diretório com
mkdir
. Isso é seguro contra o roubo de truques de propriedade, porque isso não reutilizará um arquivo existente, mas está sujeito à mesma negação de serviço que os arquivos comuns, portanto, você deve usar um nome aleatório.mktemp -d
é uma ótima maneira de fazer isso. - Você pode criar um soquete (não há um utilitário de shell padrão para isso). Como o caso do diretório, ele é seguro contra truques de propriedade, mas não contra negação de serviço.
O Linux honra permissões em sockets nomeados, mas existem variantes Unix que não o fazem. É por isso que os soquetes em/tmp
geralmente são criados em subdiretórios.
Programas que criam um subdiretório de /tmp
(ou $TMPDIR
se definido) e criam um soquete nomeado incluem servidores X11, ssh-agent, gpg-agent, KDE, emacs,… (são apenas os que existem na máquina onde estou postando isso). Como você pode ver, você estará em boa companhia.