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 mkfifo
ou 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 foo
falharia 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"
Gilles 'SO- parar de ser mau'
fonte
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Armadilha pode fazer sua própria expansão variável?$tempdir
no momento em que otrap
comando 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 detempdir
contiver uma única citação, enquanto o meu código sempre funciona.$tempdir
foi 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
mktemp
para criar um diretório com segurança e, em seguida, colocar seu pipe nomeado dentro desse diretório, fazer umrm -R $dir
para se livrar dele no final.fonte
mktemp
diretó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":
fonte
-u
opçã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-t
troca não é desanimada, é-p
ruim.Você pode usar
mktemp
para criar um arquivo temporário, excluí-lo e criar um pipe nomeado com o mesmo nome.Por exemplo:
fonte
$TMPPIPE
antesmkfifo
evita o problema "inseguro" associado a issoTMPPIPE=`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.mktemp
página de manual chamada-u
opção 'insegura'?mktemp -d
você ainda tem alguns pontos para sua contribuição. Obrigado por toda a sua ajuda, eu realmente aprecio isso!mktemp -u
nã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
mkfifo
oumknod
no 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.O pipe nomeado pode ser excluído como qualquer arquivo:
O NamedPipe pode ser usado como arquivo regular para leitura apenas uma vez.
http://www.linuxjournal.com/article/2156
fonte
mkfifo
. Ele não aborda minha pergunta sobre pipes nomeados temporários , mais do quemkdir
trataria da criação de diretórios temporários.mktemp
resolve os problemas abordados para criar com segurança um pipe nomeado?mktemp
resultado em si (é claro, excluindo o arquivo temporário primeiro e depois executandomkfifo
o mesmo).mktemp
também pode ser usado para criar um diretório temporário, tente com-t -d
switch.