Вопрос или проблема
Я пытался создать временный именованный fifo и, ссылаясь на Bash: создать анонимный fifo, увидел, что они используют mktemp -u
, чтобы получить имя файла для fifo. В руководстве указано, что это небезопасно.
-u, --dry-run
не создавать ничего; просто напечатать имя (небезопасно)
Почему это небезопасно и как использовать эту технику ответственно?
Что они имели в виду под “небезопасно” выше, это следующее. Представим такую ситуацию:
- Вы запускаете
mktemp -u
- Он выводит имя, например,
/tmp/tmp.njxOsokU9u
- Вы сохраняете это имя где-то, предположительно в переменной bash (например,
tmp
) - Ваш скрипт выполняет какую-то работу, не связанную с этим файлом
- Ваш скрипт затем пытается использовать временный файл (
echo hello > $tmp
)
Вроде все нормально, да? Вот подобная ситуация:
- Вы запускаете
mktemp -u
- Он выводит имя, например,
/tmp/tmp.njxOsokU9u
- Вы сохраняете это имя где-то, предположительно в переменной bash (например,
tmp
) - Ваш скрипт выполняет какую-то работу, не связанную с этим файлом
- Некоторый другой процесс, не связанный с вашим скриптом, создает файл с тем же именем (т.е.
/tmp/tmp.njxOsokU9u
) - Ваш скрипт затем пытается использовать временный файл (
echo hello > $tmp
)
Теперь ваш скрипт и другой процесс могут писать в один и тот же файл, что, вероятно, закончится плохо. Поэтому это помечено как небезопасно.
В контексте mktemp, “безопасно” означает защищенность от непреднамеренного вмешательства других программ, особенно в результате конфликта имен. mktemp пытается дать вам некоторую уверенность, что, хотя ваш файл находится в файловой системе, общей с множеством других программ, ваш скрипт, вероятно, будет единственным, кто взаимодействует с файлом. mktemp обрабатывает это для вас тремя способами:
- Он создает имена со случайными символами, поэтому они вряд ли будут совпадать с именами других программ (или других запущенных экземпляров того же скрипта).
- Он задает разрешения на файл так, чтобы он был доступен для чтения и записи только владельцу, что ограничивает количество других программ, которые могут его нарушить.
- Он проверяет, что имя уже не используется. Иными словами, он проверяет, что файл еще не существует.
Тестовый запуск mktemp не может обрабатывать для вас разрешения (#2), но это достаточно легко сделать самому с помощью chmod, если нужно.
Проблема, о которой вас предупреждает документация mktemp, это #3. Хотя вызов mktemp в текущем скрипте обеспечит, что имя еще не используется на данный момент, это не передается другим программам. Следовательно, другая программа или параллельный вызов того же скрипта могут снова вызвать mktemp и получить тот же временный путь к файлу.
Единственное время, когда вам следует использовать mktemp --dry-run
, это для программ, которые не позволяют своему выходному файлу или директории уже существовать. Многие программы имеют опцию типа -f
или --force
, чтобы игнорировать и перезаписывать выходной файл, хотя это также может иметь другие нежелательные эффекты.
Если вы используете mktemp --dry-run
, вы должны рассмотреть другие действия, чтобы уменьшить вероятность конфликта имен, а именно:
- Увеличьте количество случайных символов в имени файла (функция mktemp #1, выше).
- Минимизируйте количество времени между вызовом
mktemp --dry-run
и моментом, когда файл будет создан. Также можно позволить mktemp создать файл и удалить его непосредственно перед тем, как другая команда создаст файл по временному пути.
Ответ или решение
Когда вы используете команду mktemp --dry-run
, существует ряд проблем, которые стоит принять во внимание. Первая и основная проблема связана с безопасностью в плане коллизии имен. При использовании mktemp --dry-run
или mktemp -u
, программа не создает файл, а просто генерирует уникальное имя. Это означает, что существует вероятность, что другой процесс может занять это имя, прежде чем ваш скрипт успеет его использовать. Давайте рассмотрим подробно, почему это небезопасно и как минимизировать риски.
Почему использование mktemp --dry-run
небезопасно?
Коллизии Имен: Поскольку mktemp --dry-run
просто выдает имя без его создания, другая программа может создать файл с тем же именем. Это может привести к обмену данными и несанкционированному доступу к информации, которая может оказаться критически важной.
Отсутствие управления правами: В отличие от стандартной работы mktemp
, которая создает файл с определенными правами доступа (только для владельца), --dry-run
этого не делает. Это может привести к тому, что файл будет доступен не только для вашей программы, но и для других, что может вызвать проблемы с безопасностью.
Как безопасно работать с mktemp --dry-run
?
-
Увеличьте Количество Случайных Символов: Вы можете модифицировать шаблон имени, чтобы он содержал больше случайных символов. Это уменьшит вероятность того, что другое приложение создаст файл с таким же именем. Например, можно использовать
mktemp --dry-run -u /tmp/myfifo.XXXXXX
. -
Снизьте Задержку Использования Имени: Убедитесь, что время между генерацией имени и его использованием минимально. Это уменьшит шансы того, что другой процесс успеет создать файл с таким же именем.
-
Создавайте и Немедленно Удаляйте: Можно создать файл с помощью полного
mktemp
, затем сразу его удалить перед использованием имени для создания FIFO или другого файла. Это даст вам больше уверенности в безопасности операции и избежит коллизий имен. -
Используйте Уровень контроля Для Программно-созданных Файлов: Некоторые программы имеют возможность не перезаписывать существующие файлы (например, без использования опции
-f
или--force
). Убедитесь, что такие опции используются, чтобы предотвратить случайные изменения файлов.
Заключение
Использование mktemp --dry-run
может быть полезным в определенных ситуациях, когда важен лишь предварительный просмотр имени файла или директории. Однако необходимо следовать приведенным выше рекомендациям, чтобы минимизировать риски и обеспечить надежное выполнение скриптов. Дополнительное внимание к этим аспектам поможет вам избежать критических ошибок и защитить вашу данные и коды от непредвиденных случаев.
Оптимизация:
- Тегирование: включите такие ключевые слова, как "безопасность скриптов", "коллизия имен", "управление файлами в Linux", чтобы улучшить поисковую оптимизацию.
- Читабельность: Использование структурированного подхода и четких перечней (bullet points) может помочь легко воспринимать информацию и удерживать внимание читателя.