Perché non c'è il comando mktemp in POSIX?

Oct 16 2020

Una delle cose più comuni che gli script di shell devono fare è creare e manipolare file temporanei. Farlo in modo sicuro è una seccatura, poiché è necessario evitare conflitti di nomi, evitare condizioni di competizione, assicurarsi che il file abbia i permessi corretti, ecc. (Vedere il manuale GNU Coreutils e questo post del blog Segni di banalità per una discussione più dettagliata di questi La maggior parte dei sistemi operativi Unix risolvono questo problema fornendo un mktempcomando che si prende cura di tutti questi trucchi. Tuttavia, la sintassi e la semantica di questi mktempcomandi non sono standardizzate . Se vuoi davvero creare un file temporaneo sia in modo sicuro che portabile, devi ricorrere a brutti kludge come i seguenti:

tmpfile=$( echo 'mkstemp(template)' | m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit

(Questa soluzione alternativa sfrutta il fatto che il processore macro m4fa parte di POSIX ed m4espone la funzione di libreria standard C mkstemp()che è anche definita da POSIX.)

Premesso tutto questo, perché POSIX non ha standardizzato un mktempcomando, garantendone la presenza e almeno alcuni aspetti del suo comportamento? Si tratta di una svista lampante da parte del comitato POSIX o l'idea di standardizzare un a mktempè stata effettivamente discussa dal comitato e rifiutata per qualche motivo tecnico o altro?

Risposte

15 StéphaneChazelas Oct 16 2020 at 11:34

Questo viene visualizzato regolarmente nella mailing list di Austin Group, e non ho l'impressione che Open Group sarebbe contrario a specificarlo. Serve solo qualcuno che proponga qualcosa. Vedi ad esempio questo messaggio di Eric Blake (Red Hat, si siede sul meeting POSIX settimanale) del 2011 (qui copiato da gmane):

Date: Tue, 10 May 2011 07:13:32 -0600
From: Eric Blake <[email protected]>
To: Nico Schottelius <[email protected]>
Cc: austin-group-l-7882/[email protected]
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: No mktemp in posix?
Organization: Red Hat
Message-ID: <[email protected]>
References: <[email protected]>
Xref: news.gmane.org gmane.comp.standards.posix.austin.general:4151

On 05/10/2011 04:50 AM, Nico Schottelius wrote:
> Good morning,
>
> digging through Issue 7, I haven't found any utility that gives
> the ability to create a secure, temporary file that is usually
> implemented in mktemp.

echo 'mkstemp(fileXXXXXX)' | m4

will output the name of a just-created temporary file.  However, I agree
that there does not seem to be any standardized utility that gives
mkdtemp functionality, which is often more useful than mkstemp (after
all, once you have a secure temporary directory, then you can create
secure fifos within that directory, rather than having to wish for a
counterpart 'mkftemp' function).

> Is there no mktemp utility by intent or can we add it in the
> next issue?

I know both BSD and GNU have a mktemp(1) that wraps mktemp(), mkstemp(),
and mkdtemp().  In my inbox, I have record of some off-list email in
February of this year regarding some work between those teams to try and
converge on some common functionality and to word that in a manner
appropriate for the standard, although I can't find any publicly
archived messages to that effect.  But yes, I think adding mktemp(1) to
the next revision of the standard would be worthwhile.  I'll try to
revive those efforts and actually post some proposed wording.

--
Eric Blake   [email protected]    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

In un thread più recente (che vale la pena leggere), Geoff Clare (da Open Group):

Date: Wed, 2 Nov 2016 15:13:46 +0000
From: Geoff Clare <gwc-7882/[email protected]>
To: austin-group-l-7882/[email protected]
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: [1003.1(2013)/Issue7+TC1 0001016]: race condition with set -C
Message-ID: <[email protected]>
Xref: news.gmane.org gmane.comp.standards.posix.austin.general:13408

Stephane Chazelas <[email protected]> wrote, on 02 Nov 2016:
>
> At the moment, there's no way (that I know) to create a temp file
> reliably with POSIX utilities

Given an m4 utility that conforms to the 2008 standard, there is:

tmpfile=$(echo 'mkstemp(/tmp/fooXXXXXX)' | m4)

However, I don't know how widespread support for the new mkstemp()
macro is.

--
Geoff Clare <g.clare-7882/[email protected]>
The Open Group, Apex Plaza, Forbury Road, Reading, RG1 1AX, England

(che è dove ho imparato quel trucco a cui ti riferisci nella tua domanda).

2 schily Oct 17 2020 at 21:39

L' mktemp(1)utilità è stata introdotta da OpenBSD-2.1, originariamente rilasciato il 1 giugno 1997.

Nel frattempo è disponibile su varie piattaforme tra cui Solaris e Linux.

Se ti piace averlo nello standard POSIX, c'è una grande possibilità di farlo se fai una proposta per il testo standard correlato.

Nota che POSIX non fa "invenzioni", ma poiché questo programma esiste già su almeno una piattaforma certificata, questo non è un problema.

Tutti possono fare una proposta a: https://austingroupbugs.net/ basta richiedere un account e fare una "segnalazione di bug"

Se ti piace fare una proposta del genere, il tuo compito sarebbe quello di investigare il minimo comune denominatore di tutte le implementazioni disponibili (cioè controllare cosa è comune a * BSD, Solaris e Linux) e scrivere una pagina man che descriva il minimo comune denominatore. Non dimenticare di menzionare comportamenti non specificati o non definiti che potrebbero esistere a causa di comportamenti incompatibili di differenti implementazioni.

Se fai un buon lavoro e la tua proposta di testo è disponibile fino alla fine di questo mese e non necessita di molte correzioni per l'approvazione da parte della teleconferenza del gruppo principale di Austin, ci sono buone probabilità che questa possa essere inclusa nella prossima versione standard ( Issue-8) che dovrebbe essere approvato il prossimo anno dal gruppo di Austin e successivamente da IEEE. Abbiamo appena rilasciato internamente la bozza 1.1 per la nuova versione standard. Se non arriva al numero 8, ci vorranno alcuni anni per avere una possibilità per il numero 9.

Per darvi un'idea su ciò che lo sforzo è necessario per un programma non banale che sta per essere aggiunto a POSIX, ho scritto una proposta per il testo standard POSIX per gettext(1), xgettext(1), msgfmt(1)e la gettext(3)famiglia insieme con uno studente presso l'Istituto Hasso Plattner come parte di un seminario da gennaio a marzo e abbiamo già trascorso altri 3 mesi nelle teleconferenze (due a settimana) del nucleo di Austin.