Shell Script mktemp, каков наилучший способ создания временного именованного канала?

Я знаю, что лучше создавать временные файлы с помощью mktemp , но как насчет названных каналов?

У меня есть идея, я уверен, что это сработает, но мне бы очень понравилось мнение экспертов.

Я предпочитаю, чтобы все было как можно лучше, чем POSIX, но Linux приемлемо. Избегание башизмов – это мои единственные жесткие критерии, которые я пишу в dash .

  • Перенаправление и вывод труб
  • Проблема с получением интерактивного ввода во время цикла чтения
  • netcat не печатает ответ
  • Как конвейер знает, когда останавливать
  • Что делает процесс Unix умирать с Broken pipe?
  • более длинная строка для tr вызывает зависание и всплеск процессора
  • Проблема с трубами. Труба прекращается, когда читатель делает
  • Автоматизация труб?
  • 5 Solutions collect form web for “Shell Script mktemp, каков наилучший способ создания временного именованного канала?”

     tmppipe=$(mktemp -u) mkfifo -m 600 "$tmppipe" 

    В отличие от обычного создания файла, который подвержен захвату существующим файлом или символической ссылкой, создание канала имени через mkfifo или базовую функцию либо создает новый файл в указанном месте, либо не выполняется. Что-то вроде : >foo небезопасно, потому что если злоумышленник может предсказать вывод mktemp то злоумышленник может создать целевой файл для себя. Но mkfifo foo потерпит неудачу в таком сценарии.

    Если вам нужна полная мобильность POSIX, mkfifo -m 600 /tmp/myfifo безопасен против угона, но склонен к отказу в обслуживании; без доступа к сильному генератору имен случайных файлов, вам нужно будет управлять повторными попытками.

    Если вам не нужны тонкие проблемы безопасности во временных файлах, вы можете следовать простому правилу: создать частный каталог и сохранить все там.

     tmpdir=$(mktemp -d) trap 'rm -rf "$tmpdir"' EXIT INT TERM HUP mkfifo "$tmpdir/pipe" 

    Более безопасная альтернатива – использовать mktemp для безопасного создания каталога, затем поместить свой именованный канал в этот каталог, сделать rm -R $dir чтобы избавиться от него в конце.

    Используйте опцию «сухой ход»:

     mkfifo $(mktemp -ut pipe.XXX) 

    Вы можете использовать mktemp для создания временного файла, затем удалить его и создать именованный канал с тем же именем.

    Например:

     TMPPIPE=$(mktemp -t pipe.XXX) && { rm -f $TMPPIPE mkfifo $TMPPIPE } 

    Используйте mkfifo или mknod в Unix, где двумя отдельными процессами можно получить доступ к каналу по имени – один процесс может открыть его как читателя, а другой – как писателя.

     mkfifo my_pipe gzip -9 -c < my_pipe > out.gz cat file > my_pipe 

    Именованный канал можно удалить так же, как любой файл:

     rm my_pipe mkfifo --mode=0666 /tmp/namedPipe gzip --stdout -d file.gz > /tmp/namedPipe 

    NamedPipe можно использовать обычный файл только для чтения.

    http://www.linuxjournal.com/article/2156

    Linux и Unix - лучшая ОС в мире.