1.\"	$OpenBSD: mktemp.1,v 1.23 2003/06/17 21:56:25 millert Exp $
2.\"
3.\" Copyright (c) 1996, 2000, 2001 Todd C. Miller <Todd.Miller@courtesan.com>
4.\"
5.\" Permission to use, copy, modify, and distribute this software for any
6.\" purpose with or without fee is hereby granted, provided that the above
7.\" copyright notice and this permission notice appear in all copies.
8.\"
9.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16.\"
17.Dd September 30, 2001
18.Dt MKTEMP 1
19.Os
20.Sh NAME
21.Nm mktemp
22.Nd make temporary filename (unique)
23.Sh SYNOPSIS
24.Nm mktemp
25.Op Fl dqtu
26.Op Fl p Ar directory
27.Op Ar template
28.Sh DESCRIPTION
29The
30.Nm mktemp
31utility takes the given filename
32.Ar template
33and overwrites a portion of it to create a unique filename.
34The
35.Ar template
36may be any filename with some number of
37.Ql X Ns s
38appended
39to it, for example
40.Pa /tmp/tfile.XXXXXXXXXX .
41If no
42.Ar template
43is specified a default of
44.Pa tmp.XXXXXXXXXX
45is used and the
46.Fl t
47flag is implied (see below).
48.Pp
49The trailing
50.Ql X Ns s
51are replaced with a combination of the current process number and
52random letters.
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.Fn 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 some 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 SEE ALSO
225.Xr mkdtemp 3 ,
226.Xr mkstemp 3 ,
227.Xr mktemp 3
228.Sh HISTORY
229The
230.Nm
231utility appeared in
232.Ox 2.1 .
233