tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
В отличие от обычного создания файла, которое может быть взломано существующим файлом или символической ссылкой, создание канала имен mkfifo
или базовой функции либо создает новый файл в указанном месте, либо завершается ошибкой. Нечто подобное : >foo
небезопасно, потому что если злоумышленник может предсказать вывод, mktemp
то злоумышленник может создать целевой файл для себя. Но mkfifo foo
потерпел бы неудачу в таком сценарии.
Если вам нужна полная переносимость POSIX, mkfifo -m 600 /tmp/myfifo
она безопасна от угона, но склонна к отказу в обслуживании; без доступа к генератору случайных имен файлов вам потребуется управлять попытками повторных попыток.
Если вас не волнуют небольшие проблемы с безопасностью вокруг временных файлов, вы можете следовать простому правилу: создать личный каталог и хранить там все.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"