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