C'è qualche vantaggio nel creare un file temporaneo in modo più accurato
I file temporanei vengono solitamente creati nella directory temporanea (come /tmp
) dove tutti gli altri utenti e processi hanno accesso in lettura e scrittura (qualsiasi altro script può creare i nuovi file lì). Pertanto lo script dovrebbe prestare attenzione alla creazione dei file, come l'utilizzo con i permessi corretti (ad es. sola lettura per il proprietario, vedere:help umask
) e il nome del file non dovrebbe essere facilmente indovinato (idealmente casuale). In caso contrario, se i nomi dei file non sono univoci, può creare un conflitto con lo stesso script eseguito più volte (ad es. race condition) o qualche utente malintenzionato potrebbe dirottare alcune informazioni sensibili (ad es. quando le autorizzazioni sono troppo aperte e il nome del file è facile da indovinare) o creare /sostituendo il file con la propria versione del codice (come sostituire i comandi o le query SQL a seconda di ciò che viene archiviato).
Puoi utilizzare il seguente approccio per creare la directory temporanea:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
o file temporaneo:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Tuttavia è ancora prevedibile e non considerato sicuro.
Come da man mktemp
, possiamo leggere:
Tradizionalmente, molti script di shell prendono il nome del programma con pid come suffisso e lo usano come nome di file temporaneo. Questo tipo di schema di denominazione è prevedibile e la race condition che crea è facile da vincere per un utente malintenzionato.
Quindi, per sicurezza, si consiglia di utilizzare mktemp
comando per creare un file o una directory temporanea univoca (-d
).
Il mktemp(1)
la pagina man lo spiega abbastanza bene:
Tradizionalmente, molti script di shell prendono il nome del programma con pid come suffisso e lo usano come nome di file temporaneo. Questo tipo di schema di denominazione è prevedibile e la race condition che crea è facile da vincere per un attaccante. Un approccio più sicuro, sebbene ancora inferiore, consiste nel creare una directory temporanea utilizzando lo stesso schema di denominazione. Sebbene ciò consenta di garantire che un file temporaneo non venga sovvertito, consente comunque un semplice attacco denial of service. Per queste ragioni si suggerisce di usare invece mktemp.
In uno script, invoco mktemp qualcosa di simile
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
che crea una directory temporanea in cui posso lavorare e in cui posso tranquillamente nominare i file effettivi in modo leggibile e utile.
mktemp
non è standard, ma esiste su molte piattaforme. Le "X" verranno generalmente convertite in una certa casualità, e più saranno probabilmente più casuali; tuttavia, alcuni sistemi (busybox ash, per esempio) limitano questa casualità in modo più significativo rispetto ad altri
A proposito, la creazione sicura di file temporanei è importante per qualcosa di più del semplice scripting della shell. Ecco perché python ha tempfile, perl ha File::Temp, ruby ha Tempfile, ecc...
Potresti voler dare un'occhiata a mktemp
L'utilità mktemp prende il modello di nome file specificato e ne sovrascrive una parte per creare un nome file univoco. Il modello può essere qualsiasi nome di file con un numero di 'X' aggiunto ad esso, ad esempio/tmp/tfile.XXXXXXXXXX. Le "X" finali vengono sostituite con una combinazione del numero del processo corrente e lettere casuali.
Per maggiori dettagli:man mktemp
Sì, usa mktemp.
Creerà un file temporaneo all'interno di una cartella progettata per l'archiviazione di file temporanei e ti garantirà un nome univoco. Emette il nome di quel file:
> mktemp
/tmp/tmp.xx4mM3ePQY
>