Risposte:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
A differenza della normale creazione di file, che è soggetta a dirottamento da un file esistente o da un collegamento simbolico, la creazione di una pipe con il nome mkfifo
o la funzione sottostante crea un nuovo file nel posto specificato o fallisce. Qualcosa di simile : >foo
non è sicuro perché se l'attaccante è in grado di prevedere l'output di mktemp
allora, l'attaccante può creare il file di destinazione per se stesso. Ma mkfifo foo
fallirebbe in un simile scenario.
Se hai bisogno della completa portabilità POSIX, mkfifo -m 600 /tmp/myfifo
è sicuro contro il dirottamento ma incline a una negazione del servizio; senza l'accesso a un potente generatore di nomi di file casuali, è necessario gestire i tentativi di nuovo tentativo.
Se non ti interessano i sottili problemi di sicurezza relativi ai file temporanei, puoi seguire una semplice regola: creare una directory privata e tenere tutto lì dentro.
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
? Trap può fare la propria espansione variabile?
$tempdir
nel momento in cui trap
viene valutato il comando, non nel momento in cui viene attivata la trap. In questo caso, non fa alcuna differenza, tranne che il tuo codice si rompe orribilmente se il valore di tempdir
contiene una singola virgoletta, mentre il mio codice funziona sempre.
$tempdir
stato dichiarato localmente e deve essere definito a livello globale affinché Trap possa accedervi. Ha senso adesso ...
$tempdir
valore non cambia neanche, il che è accettabile praticamente per tutti gli scopi.
Un'alternativa più sicura consiste nell'utilizzare mktemp
per creare una directory in modo sicuro, quindi inserire la propria pipe denominata all'interno di quella directory, fare una cosa rm -R $dir
per sbarazzarsene alla fine.
mktemp
directory, dato che era davvero l'unica risposta accettabile, nel caso non l'avessi notato, @Gilles ha già pubblicato questa risposta in modo approfondito.
Utilizzare l'opzione "dry-run":
mkfifo $(mktemp -ut pipe.XXX)
-u
dell'opzione "non è incoraggiato".
-t
, ma fintanto che funziona in modo affidabile, ci andrei.
-t
è scoraggiato?
mkstemp()
funzione ( linux.die.net/man/3/mkstemp ). L' -t
interruttore non è scoraggiato, lo è -p
, il mio male.
È possibile utilizzare mktemp
per creare un file temporaneo, quindi eliminarlo e creare una pipa denominata con lo stesso nome.
Per esempio:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
prima mkfifo
evita il problema "non sicuro" associato TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
è in realtà sicuro, a differenza della normale creazione di file dalla shell. In caso contrario, la creazione di un file e la sua eliminazione non sarebbe affatto utile (in effetti faciliterebbe notevolmente il lavoro dell'attaccante non richiedendogli di indovinare il nome del file). Quindi la risposta di dogbane funziona, ma la creazione di file intermedi è una complicazione inutile.
mktemp
pagina man ha chiamato l' -u
opzione 'non sicuro'?
mktemp -d
hai comunque ottenuto alcuni punti per il tuo contributo. Grazie per tutto il tuo aiuto, lo apprezzo davvero!
mktemp -u
non è sicuro quando si crea un file regolare, perché fornisce la protezione contro la negazione del servizio (se il nome che genera è sufficientemente imprevedibile) ma non impedisce a un utente malintenzionato di creare il file sotto il naso del programma. La creazione di un file FIFO invece di un normale è un caso d'uso raro che la pagina man non risolve.
Usa mkfifo
o mknod
in Unix, dove due processi separati possono accedere alla pipe per nome: un processo può aprirlo come lettore e l'altro come scrittore.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
La pipe denominata può essere eliminata come qualsiasi altro file:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe può essere utilizzato un normale file per la sola lettura.
mkfifo
. Non affronta la mia domanda sulle pipe temporanee con nome, più di quanto non mkdir
riguarderebbe la creazione di directory temporanee.
mktemp
risolve i problemi che risolvono per creare in modo sicuro una pipe denominata?
mktemp
risultato stesso (ovviamente cancellando prima il file temporaneo e quindi eseguendolo mkfifo
sullo stesso). mktemp
può anche essere usato per creare una directory temporanea, provare con -t -d
switch.