[BACK]Return to mktemp.1 CVS log [TXT][DIR] Up to [local] / src / usr.bin / mktemp

Annotation of src/usr.bin/mktemp/mktemp.1, Revision 1.18

1.18    ! aaron       1: .\"    $OpenBSD: mktemp.1,v 1.17 2000/06/26 02:43:31 pjanzen Exp $
1.1       millert     2: .\"
1.13      millert     3: .\" Copyright (c) 1996, 2000 Todd C. Miller <Todd.Miller@courtesan.com>
                      4: .\" All rights reserved.
1.1       millert     5: .\"
                      6: .\" Redistribution and use in source and binary forms, with or without
                      7: .\" modification, are permitted provided that the following conditions
                      8: .\" are met:
                      9: .\" 1. Redistributions of source code must retain the above copyright
                     10: .\"    notice, this list of conditions and the following disclaimer.
                     11: .\" 2. Redistributions in binary form must reproduce the above copyright
                     12: .\"    notice, this list of conditions and the following disclaimer in the
                     13: .\"    documentation and/or other materials provided with the distribution.
1.13      millert    14: .\" 3. The name of the author may not be used to endorse or promote products
                     15: .\"    derived from this software without specific prior written permission.
1.1       millert    16: .\"
1.13      millert    17: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
                     18: .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
                     19: .\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
                     20: .\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     21: .\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     22: .\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     23: .\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     24: .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     25: .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     26: .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.1       millert    27: .\"
1.11      aaron      28: .Dd November 20, 1996
1.1       millert    29: .Dt MKTEMP 1
                     30: .Os
                     31: .Sh NAME
                     32: .Nm mktemp
                     33: .Nd make temporary file name (unique)
                     34: .Sh SYNOPSIS
                     35: .Nm mktemp
1.5       millert    36: .Op Fl d
                     37: .Op Fl q
1.1       millert    38: .Op Fl u
                     39: .Ar template
                     40: .Sh DESCRIPTION
                     41: The
                     42: .Nm mktemp
                     43: utility takes the given file name template and overwrites a
1.15      aaron      44: portion of it to create a unique file name.
                     45: The template may be any file name with some number of
1.1       millert    46: .Ql X Ns s
                     47: appended
                     48: to it, for example
1.12      millert    49: .Pa /tmp/temp.XXXXXXXXXX .
1.15      aaron      50: .Pp
1.1       millert    51: The trailing
                     52: .Ql X Ns s
1.16      aaron      53: are replaced with a combination of the current process number and
1.15      aaron      54: random letters.
                     55: The name chosen depends both on the number of
1.13      millert    56: .Ql X Ns s
                     57: in the template and the number of collisions with pre-existing files.
1.1       millert    58: The number of unique file names
                     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.13      millert    71: can successfully generate a unique file name, the file (or directory)
                     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.15      aaron      80: the PID as a suffix and use that as a temporary file name.
                     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.
                     95: .It Fl q
1.15      aaron      96: Fail silently if an error occurs.
                     97: This is useful if
1.5       millert    98: a script does not want error output to go to standard error.
1.1       millert    99: .It Fl u
                    100: Operate in
                    101: .Dq unsafe
1.15      aaron     102: mode.
                    103: The temp file will be unlinked before
1.1       millert   104: .Nm
1.15      aaron     105: exits.
                    106: This is slightly better than
1.1       millert   107: .Fn mktemp 3
1.15      aaron     108: but still introduces a race condition.
                    109: Use of this option is not encouraged.
1.6       millert   110: .El
1.15      aaron     111: .Pp
1.1       millert   112: The
                    113: .Nm
                    114: utility
1.10      aaron     115: exits with a value of 0 on success or 1 on failure.
1.1       millert   116: .Sh EXAMPLES
                    117: The following
                    118: .Xr sh 1
                    119: fragment illustrates a simple use of
                    120: .Nm
                    121: where the script should quit if it cannot get a safe
                    122: temporary file.
                    123: .Bd -literal -offset indent
1.17      pjanzen   124: CMD=`basename $0`
                    125: TMPFILE=`mktemp /tmp/$CMD.XXXXXXXXXX` || exit 1
1.1       millert   126: echo "program output" >> $TMPFILE
                    127: .Ed
                    128: .Pp
1.12      millert   129: In this case, we want the script to catch the error ourselves.
1.1       millert   130: .Bd -literal -offset indent
1.17      pjanzen   131: CMD=`basename $0`
                    132: TMPFILE=`mktemp -q /tmp/$CMD.XXXXXXXXXX`
1.2       millert   133: if [ $? -ne 0 ]; then
1.17      pjanzen   134:        echo "$CMD: Can't create temp file, exiting..."
1.1       millert   135:        exit 1
                    136: fi
1.12      millert   137: .Ed
                    138: .Pp
                    139: Or perhaps you don't want to exit if
                    140: .Nm
1.15      aaron     141: is unable to create the file.
                    142: In this case you can protect the part of the script thusly.
1.12      millert   143: .Bd -literal -offset indent
1.17      pjanzen   144: CMD=`basename $0`
                    145: TMPFILE=`mktemp /tmp/$CMD.XXXXXXXXXX` && {
1.12      millert   146:        # Safe to use $TMPFILE in this block
                    147:        echo data > $TMPFILE
                    148:        ...
                    149:        rm -f $TMPFILE
                    150: }
1.1       millert   151: .Ed
                    152: .Sh SEE ALSO
1.8       millert   153: .Xr mkdtemp 3 ,
1.10      aaron     154: .Xr mkstemp 3 ,
                    155: .Xr mktemp 3
1.1       millert   156: .Sh HISTORY
                    157: The
                    158: .Nm
                    159: utility appeared in
1.7       millert   160: .Ox 2.1 .