Como podemos obter um nome de arquivo temporário em um script IEEE 1003.1 em conformidade com o padrão?

2

Como podemos obter um nome de arquivo temporário em um script de shell em conformidade com o padrão (usando nenhum comando ou extensão que não esteja descrito nos Edição de 2013 do IEEE 1003.1 .

Não parece haver nenhum utilitário para gerar um nome de arquivo temporário, apenas funções da biblioteca C.

    
por Kaz 26.01.2014 / 01:40

2 respostas

1

Não é fácil.

Você pode obter um arquivo temporário (excluído) e ter um fd aberto nele:

exec 3<<EOF
whatever
EOF

Mas você não pode escrever mais tarde e não há nenhum comando que possa fazer você seek voltar em um fd.

Você pode tentar implementá-lo manualmente:

mktemp() (
  prefix=$1
  i=0; suffix=
  set -C
  until
    file=$prefix$suffix
    error=$({ : > "$file"; } 2>&1)
  do
    if [ ! -e "$file" ] && [ ! -L "$file" ]; then
      # that probably failed for another reason than noclobber. Give up.
      printf >&2 'Cannot create "%s": %s\n' "$file" "$error"
      return 1
    fi
    i=$(($i + 1))
    suffix=.$i
  done
  printf '%s\n' "$file"
)

Se você quiser alguma aleatoriedade no nome do arquivo, awk tem rand() , que você pode usar com printf("%c") .

O melhor é evitar arquivos temporários, se possível. Tenha em mente que a limpeza deles é quase tão dolorosa quanto a criação deles.

    
por 26.01.2014 / 01:53
0

Os arquivos temporários são um problema de segurança somente se forem criados em um diretório compartilhado , como /tmp ou /var/tmp . Para criar um arquivo temporário de maneira segura, basta colocá-lo em um diretório, como o diretório pessoal do usuário, onde outros usuários não têm permissão de gravação. Por exemplo:

tmpname=$HOME/.deleteme$$
some_command >"$tmpname"

Ao usar um diretório não compartilhado, todos os problemas de condições de corrida desaparecem. (Se um invasor já tiver acesso write ao seu diretório pessoal, você será penhorado e o invasor não precisará jogar com arquivos temporários e condições de corrida.)

Para garantir que o arquivo temporário seja excluído, crie um trapping

trap 'rm -f "$tmpname"' EXIT

A declaração de armadilha deve ser colocada no script antes que o arquivo temporário seja criado.

    
por 26.01.2014 / 02:33