Сценарий оболочки mktemp, что лучший метод должен создать временный именованный канал?

stty sane, или более конкретно stty echo, должен повернуться реагируют на. (stty sane зафиксирует другие терминальные причуды ввода или вывода, такие как новые строки, не возвращающиеся к левому полю.)

Ssh (и большинство других программ) выключают эхо для подсказки пароля, т.е. символы, которые Вы вводите, не отображены (отраженные) на экран. stty -echo команда оболочки с тем же эффектом. Обычно эхо должно быть снова включено (как stty echo) после подсказки пароля; это - ошибка или в ssh или в некотором другом программном обеспечении в действии здесь, таком как Ваши системные библиотеки или эмулятор терминала.

30
18.03.2019, 04:58
5 ответов
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"
41
27.01.2020, 19:38
  • 1
    я на самом деле уже выбрал это в качестве своего решения ранее вчера, я ожидал, чтобы видеть, отправил ли кто-то его, или лучший. Я также чувствовал, что dir был способом пойти в моем случае. Независимо... Спасибо за справку я ценю его. –  J. M. Becker 25.01.2012, 04:48
  • 2
    Не был Должен команда прерывания быть trap "rm -rf '$tempdir'" EXIT HUP INT TERM? Прерывание может сделать свое собственное переменное расширение? Независимый Исполняемый файл положения –  Six 09.05.2015, 08:27
  • 3
    @Six команды, которую развернула бы Ваша команда $tempdir в то время trap команда оценена, не в то время, когда прерывание инициировано. В этом случае это не имеет никакого значения, за исключением того, что Ваш код повреждается ужасно если значение tempdir содержит одинарную кавычку, тогда как мой код всегда работает. –  Gilles 'SO- stop being evil' 09.05.2015, 13:27
  • 4
    @Gilles Это - хорошая функция. Я попробовал Ваш пример одинарной кавычки без удачи, таким образом, я думал, что прерывание не могло оценить переменные во времени выполнения. Оказалось что мой $tempdir был объявлен локально, и это должно быть определено глобально для прерывания, чтобы иметь доступ к нему. Имеет смысл теперь... –  Six 09.05.2015, 13:45
  • 5
    @Gilles... пока $tempdir значение не изменяется также, который приемлем в в основном всех целях. Просто бойтесь использовать то же имя для создания нескольких временных файлов/директоров... –  MestreLion 15.01.2016, 17:50

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

Например:

TMPPIPE=$(mktemp -t pipe.XXX) && {
    rm -f $TMPPIPE
    mkfifo $TMPPIPE
}
1
27.01.2020, 19:38
  • 1
    Делает удаление $TMPPIPE перед mkfifo избегайте 'небезопасной' проблемы, связанной от выполнения TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE ? –  J. M. Becker 24.01.2012, 11:46
  • 2
    @TechZilla mkfifo на самом деле безопасно, в отличие от обычного регулярного создания файла от оболочки. Если бы это не было, то создавая файл, затем удаляя это не помогло бы вообще (на самом деле, это значительно упростило бы задание взломщика, не требуя, чтобы он предположил имя файла). Так работы ответа dogbane, но промежуточное создание файла бесполезная сложность. –  Gilles 'SO- stop being evil' 24.01.2012, 19:46
  • 3
    @Gilles, Вы знаете в какой отношение mktemp страница справочника, названная -u 'небезопасная' опция? –  J. M. Becker 25.01.2012, 04:39
  • 4
    @dogbane, я голосовал по Вашему ответу, и Ваши комментарии, которые я чувствовал, были основательными. Хотя, я уже завершил это вчера.. Я просто ожидал для наблюдения, когда кто-то отправил или мое решение или надо надеяться лучшее. Таким образом даже при том, что я использовал mktemp -d Вы все еще поняли некоторые мысли для своего входа. Спасибо за всю Вашу справку, я действительно ценю его! –  J. M. Becker 25.01.2012, 04:46
  • 5
    @TechZilla mktemp -u небезопасно при создании регулярного файла, потому что он обеспечивает защиту против отказа в обслуживании (если имя, которое он генерирует, достаточно непредсказуемо), но не препятствует тому, чтобы взломщик создал файл под носом программы. Создание FIFO вместо регулярного файла является редким вариантом использования, к которому не обращается страница справочника. –  Gilles 'SO- stop being evil' 25.01.2012, 11:41

Используйте опцию "пробного прогона":

mkfifo $(mktemp -ut pipe.XXX)
2
27.01.2020, 19:38
  • 1
    Согласно страницам справочника, использованию -u опция "не поощряется". –  dogbane 24.01.2012, 12:04
  • 2
    @dogbane Так является использованием -t, но, пока это работает надежно, я пошел бы с ним. –  polemon 24.01.2012, 12:07
  • 3
    извините, где это говорит это -t препятствуется? –  dogbane 24.01.2012, 12:11
  • 4
    @dogbane, Если бы это всегда очень важно, я подал бы крошечную заявку C, звоня mkstemp() функция (linux.die.net/man/3/mkstemp). -t переключателю не препятствуют, это -p, мое плохое. –  polemon 24.01.2012, 12:12

Использовать 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

0
27.01.2020, 19:38
  • 1
    я полностью осведомлен об именованных каналах, и mkfifo. Это не рассматривает мой вопрос о временных именованных каналах, больше, чем mkdir обратился бы к создающим временным каталогам. –  J. M. Becker 24.01.2012, 09:16
  • 2
    Как это решает проблемы это mktemp адреса для безопасного создания именованного канала? –  camh 24.01.2012, 09:17
  • 3
    , о, хорошо, лучше всего должен создать их под/tmp, они - временные файлы по определению и уберут однажды системные перезагрузки. Или еще лучше, имейте функцию оболочки, которая создаст namedpipe из mktemp закончитесь самостоятельно (ofcourse путем удаления временного файла сначала и затем выполнения mkfifo на том же). mktemp может также использоваться, чтобы создать временный каталог, попробовать -t -d переключатель. –  Nikhil Mulley 24.01.2012, 09:24

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

3
27.01.2020, 19:38
  • 1
    , я решил создать FIFO в a mktemp каталог, как это было действительно единственный приемлемый ответ, На всякий случай Вы не заметили, @Gilles уже отправил этот всесторонний ответ. стандарт конфетки –  J. M. Becker 09.12.2012, 21:14

Теги

Похожие вопросы