о чем следует беспокоиться при использовании mktemp --dry-run

6

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

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

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

Jon
источник

Ответы:

6

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

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

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

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

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

steady rain
источник
2
Но как последний сценарий отличается от того, где mktemp вызывается без -u? Даже если файл создан (в отличие только от имени), ничто не мешает другому процессу записать в тот же файл как только он был создан.
Jani Uusitalo
1
Если mktemp в вашем скрипте создает файл, mktemp в другом сценарии не будет использоваться то же имя файла, потому что файл уже существует. Он не пытается защитить от вредоносных скриптов, просто от случайного использования того же имени.
stephenwade
0

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

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

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

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

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

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