Respostas:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Ao contrário da criação regular de arquivos, que é propensa a ser invadida por um arquivo existente ou por um link simbólico, a criação de um canal de nome mkfifoou a função subjacente cria um novo arquivo no local especificado ou falha. Algo como : >fooé inseguro porque, se o invasor puder prever a saída dele mktemp, poderá criar o arquivo de destino para si mesmo. Mas mkfifo foofalharia em tal cenário.
Se você precisar de portabilidade total do POSIX, mkfifo -m 600 /tmp/myfifoé seguro contra seqüestros, mas propenso a uma negação de serviço; sem acesso a um gerador de nome de arquivo aleatório forte, você precisaria gerenciar tentativas de repetição.
Se você não se importa com os sutis problemas de segurança dos arquivos temporários, pode seguir uma regra simples: crie um diretório privado e mantenha tudo lá.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM? Armadilha pode fazer sua própria expansão variável?
$tempdirno momento em que o trapcomando for avaliado, não no momento em que a armadilha for acionada. Nesse caso, não faz diferença, exceto que o seu código quebra horrivelmente se o valor de tempdircontiver uma única citação, enquanto o meu código sempre funciona.
$tempdirfoi declarado localmente e deve ser definido globalmente para que a armadilha tenha acesso a ele. Faz sentido agora ...
$tempdir valor também não seja alterado, o que é aceitável para basicamente todos os fins. Basta ter cuidado para não usar o mesmo nome para criar vários temporários arquivos / diretórios ...
Uma alternativa mais segura é usar mktemppara criar um diretório com segurança e, em seguida, colocar seu pipe nomeado dentro desse diretório, fazer um rm -R $dirpara se livrar dele no final.
mktempdiretório, pois essa era realmente a única resposta aceitável. Caso você não tenha notado, o @Gilles já postou essa resposta em profundidade.
Use a opção "execução a seco":
mkfifo $(mktemp -ut pipe.XXX)
-uopção "não é incentivado".
-t, mas, desde que funcione de forma confiável, eu aceitaria.
-té desencorajado?
mkstemp()função ( linux.die.net/man/3/mkstemp ). A -ttroca não é desanimada, é -pruim.
Você pode usar mktemppara criar um arquivo temporário, excluí-lo e criar um pipe nomeado com o mesmo nome.
Por exemplo:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPEantes mkfifoevita o problema "inseguro" associado a isso TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE?
mkfifoé realmente seguro, ao contrário da criação normal de arquivos a partir do shell. Caso contrário, criar um arquivo e excluí-lo não ajudariam em nada (na verdade, facilitaria muito o trabalho do invasor, não exigindo que ele adivinhasse o nome do arquivo). Portanto, a resposta do dogbane funciona, mas a criação intermediária de arquivos é uma complicação inútil.
mktemppágina de manual chamada -uopção 'insegura'?
mktemp -dvocê ainda tem alguns pontos para sua contribuição. Obrigado por toda a sua ajuda, eu realmente aprecio isso!
mktemp -unão é seguro ao criar um arquivo comum, porque fornece proteção contra negação de serviço (se o nome gerado for suficientemente imprevisível), mas não impede que um invasor crie o arquivo sob o nariz do programa. Criar um fifo em vez de um arquivo normal é um caso de uso raro que a página de manual não aborda.
Use mkfifoou mknodno Unix, onde dois processos separados podem acessar o canal pelo nome - um processo pode abri-lo como um leitor e o outro como um escritor.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
O pipe nomeado pode ser excluído como qualquer arquivo:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
O NamedPipe pode ser usado como arquivo regular para leitura apenas uma vez.
mkfifo. Ele não aborda minha pergunta sobre pipes nomeados temporários , mais do que mkdirtrataria da criação de diretórios temporários.
mktempresolve os problemas abordados para criar com segurança um pipe nomeado?
mktempresultado em si (é claro, excluindo o arquivo temporário primeiro e depois executando mkfifoo mesmo). mktemptambém pode ser usado para criar um diretório temporário, tente com -t -dswitch.