Pode estar usando o valor das variáveis de ambiente TMPDIR ou TEMPDIR. Você poderia tentar definir isso para um diretório diferente e ver se o programa usa isso. Talvez seja uma configuração de configuração.
Se você conseguir excluir o diretório / tmp ou tudo nele, como usuário não-root, suas permissões parecerão erradas.
As permissões que tenho no meu sistema são:
drwxr-xr-x 26 root root 4096 2009-10-14 12:00 /
drwxrwxrwt 27 root root 12288 2009-10-19 16:10 /tmp
O diretório / só permite que o root exclua diretórios de nível superior e o bit sticky em / tmp permite que os proprietários excluam seus próprios arquivos em / tmp. Obviamente, você precisaria de root para corrigir esses problemas.
Supondo que ele use a função unlink para excluir os arquivos, você pode criar uma pequena biblioteca compartilhada que você pré-carrega, o que substitui a função de desconexão do sistema.
Crie unlink.c contendo:
int unlink(const char *pathname) {
return 0;
}
int unlinkat(int dirfd, const char *pathname, int flags) {
return 0;
}
Também sobrescrevemos a função unlinkat, caso ela use isso. Agora você pode executar:
% gcc unlink.c --shared -o unlink.so
% file unlink.so
unlink.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, not stripped
% touch foo
% LD_PRELOAD=./unlink.so rm foo
% ls foo
foo
Se você achar que seu programa precisa excluir outros arquivos, poderá tornar suas funções de substituição mais inteligentes, por exemplo, verificando o caminho que está sendo solicitado a ser excluído.