I'm aware its best to create temporary files with mktemp
, but what about named pipes?
I prefer things to be as POSIX compliant as possible, but Linux only is acceptable. Avoiding Bashisms is my only hard criteria, as I write in dash
.
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communitytmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Unlike regular file creation, which is prone to being hijacked by an existing file or a symbolic link, the creation of a name pipe through mkfifo
or the underlying function either creates a new file in the specified place or fails. Something like : >foo
is unsafe because if the attacker can predict the output of mktemp
then the attacker can create the target file for himself. But mkfifo foo
would fail in such a scenario.
If you need full POSIX portability, mkfifo -m 600 /tmp/myfifo
is safe against hijacking but prone to a denial of service; without access to a strong random file name generator, you would need to manage retry attempts.
If you don't care for the subtle security problems around temporary files, you can follow a simple rule: create a private directory, and keep everything in there.
tmpdir=
cleanup () {
trap - EXIT
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then trap - $1; kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Can trap do it's own variable expansion?
$tempdir
value does not change either, which is acceptable for basically all purposes. Just be careful not to use the same name to create multiple temp files/dirs...
Jan 15, 2016 at 15:50
INT HUP TERM
? Doesn't EXIT
cover all of those?
readonly
. But if that's an issue, you have bigger problems. If your script is so complex that you can't keep track of all the variables that it uses, you should probably use a different language.
Apr 30, 2020 at 6:36
A safer alternative is to use mktemp
to create a directory safely, then put your named pipe inside that directory, do an rm -R $dir
to get rid of it in the end.
mktemp
directory, as it was the really the only acceptable answer, Just in case you didn't notice, @Gilles already posted this answer in-depth.
Dec 9, 2012 at 19:14
Use the "dry-run" option:
mkfifo $(mktemp -ut pipe.XXX)
-u
option "is not encouraged".
-t
, but as long as it works reliably, I'd go with it.
mkstemp()
function (linux.die.net/man/3/mkstemp). The -t
switch isn't discouraged, it is -p
, my bad.
You can use mktemp
to create a temporary file, then delete it and create a named pipe with the same name.
For example:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
before the mkfifo
avoid the 'unsafe' problem associated from doing TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
Jan 24, 2012 at 9:46
mkfifo
is actually safe, unlike usual regular file creation from the shell. If it wasn't, creating a file then deleting it would not help at all (in fact it would greatly facilitate the attacker's job by not requiring him to guess the file name). So dogbane's answer works, but the intermediate file creation is a useless complication.
Jan 24, 2012 at 17:46
mktemp
man page called the -u
option 'unsafe'?
Jan 25, 2012 at 2:39
mktemp -d
you still got some points for your input. Thank you for all your help, I really appreciate it!
Jan 25, 2012 at 2:46
mktemp -u
is unsafe when creating a regular file, because it provides the protection against denial of service (if the name it generates is sufficiently unpredictable) but does not prevent an attacker from creating the file under the program's nose. Creating a fifo instead of a regular file is a rare use case that the man page doesn't address.
Jan 25, 2012 at 9:41
Use mkfifo
or mknod
in Unix, where by two separate processes can access the pipe by name — one process can open it as a reader, and the other as a writer.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
The named pipe can be deleted just like any file:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe can be used a regular file for only reading once.
mkfifo
. It doesn't address my question about temporary named pipes, anymore than mkdir
would address creating temporary directories.
Jan 24, 2012 at 7:16
mktemp
addresses to safely create a named pipe?
mktemp
result itself (ofcourse by deleting the temp file first and then running mkfifo
on the same). mktemp
can also be used to create a temporary directory, try with -t -d
switch.
Jan 24, 2012 at 7:24