6

Я пытался создать временное имя fifo и после ссылки на Bash: создать анонимный fifo, я вижу, что они используют mktemp -u для получения имени файла для fifo. Страница руководства утверждает, что это небезопасно.

-u, --dry-run
       do not create anything; merely print a name (unsafe)

Почему это небезопасно и как я могу использовать эту технику ответственно?

2 ответа2

6

То, что они подразумевали под "небезопасным" выше, заключается в следующем. Скажем, у вас есть этот сценарий:

  • Вы запускаете mktemp -u
  • Он печатает имя, скажем /tmp/tmp.njxOsokU9u
  • Вы сохраняете это имя где-то, предположительно, в переменной bash (например, tmp)
  • Ваш скрипт выполняет некоторую работу, не связанную с этим файлом
  • Затем ваш скрипт пытается использовать временный файл (echo hello > $tmp)

Ничего плохого, да? Вот похожий сценарий:

  • Вы запускаете mktemp -u
  • Он печатает имя, скажем /tmp/tmp.njxOsokU9u
  • Вы сохраняете это имя где-то, предположительно, в переменной bash (например, tmp)
  • Ваш скрипт выполняет некоторую работу, не связанную с этим файлом
  • Другой процесс, не связанный с вашим скриптом, создает файл с таким же именем (например, /tmp/tmp.njxOsokU9u)
  • Затем ваш скрипт пытается использовать временный файл (echo hello > $tmp)

Теперь ваш сценарий и другой процесс могут записывать в один и тот же файл, что, скорее всего, будет плохо. Вот почему это отмечено небезопасно.

0

В контексте mktemp "безопасный" означает защищенный от непреднамеренного вмешательства других программ, особенно в результате конфликта имен. mktemp пытается дать вам некоторую уверенность в том, что даже если ваш файл находится в файловой системе, используемой многими другими программами, ваш скрипт, вероятно, будет единственным, взаимодействующим с файлом. mktemp обрабатывает это для вас тремя способами:

  1. Он создает имена со случайными символами, поэтому они вряд ли будут иметь то же имя, что и другие программы (или другие запущенные экземпляры того же скрипта).
  2. Он устанавливает права доступа к файлу таким образом, чтобы его мог читать и записывать только его владелец, ограничивая количество других программ, которые могут его нарушить.
  3. Он проверяет, что имя еще не используется. Другими словами, он проверяет, что файл еще не существует.

Пробный запуск mktemp не может обработать разрешения для вас (# 2), но это достаточно просто сделать самостоятельно с помощью chmod, если хотите.

Проблема, о которой вас предупреждает документация mktemp, # 3. В то время как вызов Mktemp в текущем сценарии обеспечит имя не используется пока он не сообщает об этом другим программам. Поэтому другая программа или другой вызов того же сценария, работающего одновременно, может снова вызвать mktemp и получить тот же путь временного файла.

Единственный раз, когда вы захотите использовать mktemp --dry-run - это для некоторых редких программ, которые не позволяют существовать их выходному файлу или каталогу. В этих обстоятельствах вы можете уменьшить вероятность конфликта имен с помощью:

  1. Увеличение количества случайных символов в имени файла (функция mktemp # 1, выше).
  2. Минимизируйте время между вызовом mktemp и моментом создания файла. Точно так же вы можете позволить mktemp создать файл и удалить его непосредственно перед тем, как другая команда создаст файл по временному пути.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .