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