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"
Жиль "ТАК - прекрати быть злым"
источник
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Может ли trap-код создать собственную переменную?$tempdir
во времяtrap
оценки команды, а не во время срабатывания ловушки. В этом случае это не имеет никакого значения, за исключением того, что ваш код ужасно ломается, если значениеtempdir
содержит одну кавычку, тогда как мой код всегда работает.$tempdir
был объявлен локально, и он должен быть определен глобально, чтобы trap-доступ имел к нему доступ. Имеет смысл сейчас ...$tempdir
значение не изменится, что приемлемо для всех целей. Только будьте осторожны, чтобы не использовать одно и то же имя для создания нескольких временных файлов / каталогов ...Более безопасной альтернативой является безопасное
mktemp
создание каталога, затем поместите именованный канал в этот каталогrm -R $dir
и в конце сделайте, чтобы избавиться от него.источник
mktemp
каталоге, так как это был действительно единственный приемлемый ответ. На случай, если вы не заметили, @Gilles уже опубликовал этот ответ подробно.Используйте опцию «всухую»:
источник
-u
опции «не поощряется».-t
, но пока это работает надежно, я бы пошел с этим.-t
не рекомендуется?mkstemp()
функцию ( linux.die.net/man/3/mkstemp ).-t
Выключатель не рекомендуется, это-p
, мой плохой.Вы можете использовать
mktemp
для создания временного файла, затем удалить его и создать именованный канал с тем же именем.Например:
источник
$TMPPIPE
доmkfifo
» проблему «небезопасных», связанную с выполнениемTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?mkfifo
на самом деле безопасен, в отличие от обычного обычного создания файлов из оболочки. Если это не так, создание файла, то удаление его вообще не поможет (на самом деле это значительно облегчит работу злоумышленника, не требуя от него угадывать имя файла). Таким образом, ответ Dogbane работает, но создание промежуточного файла является бесполезным осложнением.mktemp
странице руководства названа-u
опция «небезопасно»?mktemp -d
вас, у вас все еще есть очки за ваш вклад Спасибо за вашу помощь, я действительно ценю это!mktemp -u
небезопасен при создании обычного файла, поскольку обеспечивает защиту от отказа в обслуживании (если генерируемое имя достаточно непредсказуемо), но не мешает злоумышленнику создать файл под носом программы. Создание fifo вместо обычного файла - это редкий случай, когда страница руководства не рассматривается.Используйте
mkfifo
илиmknod
в Unix, где два отдельных процесса могут обращаться к каналу по имени - один процесс может открыть его как читателя, а другой как писателя.Именованный канал может быть удален как любой файл:
NamedPipe можно использовать обычным файлом только для чтения один раз.
http://www.linuxjournal.com/article/2156
источник
mkfifo
. Он не отвечает на мой вопрос о временных именованных каналах, так же какmkdir
и на создание временных каталогов.mktemp
с безопасным созданием именованного канала?mktemp
результата ( конечно, сначала удалив временный файл, а затем запустивmkfifo
его).mktemp
также можно использовать для создания временного каталога, попробуйте с помощью-t -d
switch.