Existem maneiras objetivamente melhores de criar arquivos temporários em scripts bash?
Normalmente, apenas nomeio o que quer que me vem à cabeça, como tempfile-123, pois será excluído quando o script terminar. Existe alguma desvantagem em fazer isso além de substituir um possível tempfile-123 na pasta atual? Ou existe alguma vantagem em criar um arquivo temporário de uma maneira mais cuidadosa?
tempfile(1)
em sistemas que o possuem.Respostas:
A
mktemp(1)
página do manual explica bastante bem:Em um script, invoco mktemp algo como
que cria um diretório temporário no qual posso trabalhar e no qual posso nomear com segurança os arquivos reais como legíveis e úteis.
mktemp
não é padrão, mas existe em muitas plataformas. Os "X" s geralmente serão convertidos em alguma aleatoriedade, e mais provavelmente serão mais aleatórios; no entanto, alguns sistemas (cinza do busybox, por um) limitam essa aleatoriedade mais significativamente do que outrosA propósito, a criação segura de arquivos temporários é importante para mais do que apenas scripts de shell. É por isso que python possui tempfile , perl possui File :: Temp , ruby possui Tempfile , etc…
fonte
mktemp
é combinada combasename
, dessa formamktemp -dt "$(basename $0). XXXXXXXXXX"
. Se usado sembasename
você, poderá receber um erro como este modelo mktemp: invalid, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX ', contém separador de diretório .mktemp -dt "$(basename $0).XXXXXXXXXX"
é o caminho correto.$0
, há espaços a abundância na terra do OS X.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Sim, use mktemp .
Ele criará um arquivo temporário dentro de uma pasta projetada para armazenar arquivos temporários e garantirá um nome exclusivo. Ele gera o nome desse arquivo:
fonte
Você pode querer olhar
mktemp
Para mais detalhes: man mktemp
fonte
Os arquivos temporários geralmente são criados no diretório temporário (como
/tmp
), onde todos os outros usuários e processos têm acesso de leitura e gravação (qualquer outro script pode criar os novos arquivos). Portanto, o script deve ter cuidado ao criar os arquivos, como usar com as permissões certas (por exemplo, somente leitura para o proprietário, consultehelp umask
:) e o nome do arquivo não deve ser facilmente adivinhado (idealmente aleatório). Caso contrário, se os nomes de arquivos não forem exclusivos, ele poderá criar conflito com o mesmo script executado várias vezes (por exemplo , condição de corrida) ou algum invasor pode seqüestrar algumas informações confidenciais (por exemplo, quando as permissões são muito abertas e o nome do arquivo é fácil de adivinhar) ou criar / substituir o arquivo por sua própria versão do código (como substituir os comandos ou consultas SQL, dependendo do que está sendo armazenado).Você pode usar a seguinte abordagem para criar o diretório temporário:
ou arquivo temporário:
No entanto, ainda é previsível e não é considerado seguro.
De acordo com
man mktemp
, podemos ler:Para estar seguro, é recomendável usar o
mktemp
comando para criar um arquivo ou diretório temporário exclusivo (-d
).fonte
${0##*/}
e$$
expandir ou vincular a alguma documentação sobre isso.mktemp
é provavelmente o mais versátil, especialmente se você planeja trabalhar com o arquivo por um tempo.Você também pode usar um operador de substituição de processo
<()
se precisar apenas temporariamente do arquivo como entrada para outro comando, por exemplo:fonte