xref: /openbsd/usr.bin/mktemp/mktemp.1 (revision a6445c1d)
1.\"	$OpenBSD: mktemp.1,v 1.28 2013/08/07 06:19:36 deraadt Exp $
2.\"
3.\" Copyright (c) 1996, 2000, 2001, 2003, 2010, 2013
4.\"	Todd C. Miller <Todd.Miller@courtesan.com>
5.\"
6.\" Permission to use, copy, modify, and distribute this software for any
7.\" purpose with or without fee is hereby granted, provided that the above
8.\" copyright notice and this permission notice appear in all copies.
9.\"
10.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17.\"
18.Dd $Mdocdate: August 7 2013 $
19.Dt MKTEMP 1
20.Os
21.Sh NAME
22.Nm mktemp
23.Nd make temporary filename (unique)
24.Sh SYNOPSIS
25.Nm mktemp
26.Op Fl dqtu
27.Op Fl p Ar directory
28.Op Ar template
29.Sh DESCRIPTION
30The
31.Nm mktemp
32utility takes the given filename
33.Ar template
34and overwrites a portion of it to create a unique filename.
35The
36.Ar template
37may be any filename with at least six
38.Ql X Ns s
39appended
40to it, for example
41.Pa /tmp/tfile.XXXXXXXXXX .
42If no
43.Ar template
44is specified a default of
45.Pa tmp.XXXXXXXXXX
46is used and the
47.Fl t
48flag is implied (see below).
49.Pp
50The trailing
51.Ql X Ns s
52are replaced with a unique digit and letter combination.
53The name chosen depends both on the number of
54.Ql X Ns s
55in the
56.Ar template
57and the number of collisions with pre-existing files.
58The number of unique filenames
59.Nm
60can return depends on the number of
61.Ql X Ns s
62provided; ten
63.Ql X Ns s
64will
65result in
66.Nm
67testing roughly 26 ** 10 combinations.
68.Pp
69If
70.Nm
71can successfully generate a unique filename, the file (or directory)
72is created with file permissions such that it is only readable and writable
73by its owner (unless the
74.Fl u
75flag is given) and the filename is printed to standard output.
76.Pp
77.Nm mktemp
78is provided to allow shell scripts to safely use temporary files.
79Traditionally, many shell scripts take the name of the program with
80the PID as a suffix and use that as a temporary filename.
81This kind of naming scheme is predictable and the race condition it creates
82is easy for an attacker to win.
83A safer, though still inferior approach
84is to make a temporary directory using the same naming scheme.
85While this does allow one to guarantee that a temporary file will not be
86subverted, it still allows a simple denial of service attack.
87For these reasons it is suggested that
88.Nm
89be used instead.
90.Pp
91The options are as follows:
92.Bl -tag -width Ds
93.It Fl d
94Make a directory instead of a file.
95.It Fl p Ar directory
96Use the specified
97.Ar directory
98as a prefix when generating the temporary filename.
99The
100.Ar directory
101will be overridden by the user's
102.Ev TMPDIR
103environment variable if it is set.
104This option implies the
105.Fl t
106flag (see below).
107.It Fl q
108Fail silently if an error occurs.
109This is useful if
110a script does not want error output to go to standard error.
111.It Fl t
112Generate a path rooted in a temporary directory.
113This directory is chosen as follows:
114.Bl -bullet
115.It
116If the user's
117.Ev TMPDIR
118environment variable is set, the directory contained therein is used.
119.It
120Otherwise, if the
121.Fl p
122flag was given the specified directory is used.
123.It
124If none of the above apply,
125.Pa /tmp
126is used.
127.El
128.Pp
129In this mode, the
130.Ar template
131(if specified) should be a directory component (as opposed to a full path)
132and thus should not contain any forward slashes.
133.It Fl u
134Operate in
135.Dq unsafe
136mode.
137The temp file will be unlinked before
138.Nm
139exits.
140This is slightly better than
141.Xr mktemp 3
142but still introduces a race condition.
143Use of this option is not encouraged.
144.El
145.Pp
146The
147.Nm
148utility
149exits with a value of 0 on success or 1 on failure.
150.Sh ENVIRONMENT
151.Bl -tag -width TMPDIR
152.It Ev TMPDIR
153directory in which to place the temporary file when in
154.Fl t
155mode
156.El
157.Sh EXAMPLES
158The following
159.Xr sh 1
160fragment illustrates a simple use of
161.Nm
162where the script should quit if it cannot get a safe
163temporary file.
164.Bd -literal -offset indent
165TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
166echo "program output" >> $TMPFILE
167.Ed
168.Pp
169The same fragment with support for a user's
170.Ev TMPDIR
171environment variable can be written as follows.
172.Bd -literal -offset indent
173TMPFILE=`mktemp -t example.XXXXXXXXXX` || exit 1
174echo "program output" >> $TMPFILE
175.Ed
176.Pp
177This can be further simplified if we don't care about the actual name of
178the temporary file.
179In this case the
180.Fl t
181flag is implied.
182.Bd -literal -offset indent
183TMPFILE=`mktemp` || exit 1
184echo "program output" >> $TMPFILE
185.Ed
186.Pp
187In some cases, it may be desirable to use a default temporary directory
188other than
189.Pa /tmp .
190In this example the temporary file will be created in
191.Pa /extra/tmp
192unless the user's
193.Ev TMPDIR
194environment variable specifies otherwise.
195.Bd -literal -offset indent
196TMPFILE=`mktemp -p /extra/tmp example.XXXXXXXXXX` || exit 1
197echo "program output" >> $TMPFILE
198.Ed
199.Pp
200In other cases, we want the script to catch the error.
201For instance, if we attempt to create two temporary files and
202the second one fails we need to remove the first before exiting.
203.Bd -literal -offset indent
204TMP1=`mktemp -t example.1.XXXXXXXXXX` || exit 1
205TMP2=`mktemp -t example.2.XXXXXXXXXX`
206if [ $? -ne 0 ]; then
207	rm -f $TMP1
208	exit 1
209fi
210.Ed
211.Pp
212Or perhaps you don't want to exit if
213.Nm
214is unable to create the file.
215In this case you can protect that part of the script thusly.
216.Bd -literal -offset indent
217TMPFILE=`mktemp -q -t example.XXXXXXXXXX` && {
218	# Safe to use $TMPFILE in this block
219	echo data > $TMPFILE
220	...
221	rm -f $TMPFILE
222}
223.Ed
224.Sh DIAGNOSTICS
225One of the following error messages may be displayed if
226.Nm
227does not succeed and the
228.Fl q
229option was not specified:
230.Bl -tag -width indent
231.It Li "insufficient number of Xs in template"
232The specified
233.Ar template
234contained fewer than six
235.Ql X Ns s
236at the end.
237.It Li "template must not contain directory separators in -t mode"
238The
239.Ar template
240contained one or more directory components and the
241.Fl t
242option was specified.
243.It Li "cannot make temp dir"
244.Nm
245was unable to create the temporary directory for any of the reasons
246specified by
247.Xr mkdtemp 3 .
248.It Li "cannot make temp file"
249.Nm
250was unable to create the temporary file for any of the reasons
251specified by
252.Xr mkstemp 3 .
253.It Li "cannot allocate memory"
254.Nm
255was unable to allocate memory for any of the reasons specified by
256.Xr malloc 3 .
257.El
258.Sh SEE ALSO
259.Xr mktemp 3
260.Sh HISTORY
261The
262.Nm
263utility first appeared in
264.Ox 2.1 .
265