Создание временных файлов в bash

есть ли объективно лучшие способы создания временных файлов в сценариях bash?

обычно я просто называю их все, что приходит мне на ум, например tempfile-123, так как он будет удален, когда скрипт закончится. Есть ли какой-либо недостаток в этом, кроме перезаписи возможного tempfile-123 в текущей папке? Или есть какие-то преимущества в создании временного файла более осторожным способом?

4 ответов


на mktemp(1) man page объясняет это довольно хорошо:

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

в скрипте я вызываю mktemp что-то вроде

mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename ).XXXXXXXXXXXX")

который создает временный каталог, в котором я могу работать, и в котором я могу безопасно назвать фактические файлы чем-то читаемым и полезным.

mktemp не является стандартным, но он существует на многих платформах. "X" S обычно преобразуется в некоторые случайность, и больше, вероятно, будет более случайной; однако некоторые системы (busybox ash, для одного) ограничивают эту случайность более значительно, чем другие


кстати, безопасное создание временных файлов важно не только для сценариев оболочки. Вот почему python имеет tempfile, perl имеет File:: Temp, Руби Tempfile, etc...


Да, использовать mktemp.

он создаст временный файл внутри папки, предназначенной для хранения временных файлов, и гарантирует вам уникальное имя. Он выводит имя этого файла:

> mktemp
/tmp/tmp.xx4mM3ePQY
>

вы можете посмотреть на mktemp

утилита mktemp берет заданный шаблон имени файла и перезаписывает часть его, чтобы создать уникальное имя. Шаблон может быть любым имя файла с некоторым количеством "Xs", добавленных к нему, например / tmp / tfile.XXXXXXXXXX. Конечные " Xs " заменяются комбинацией текущего номера процесса и случайных букв.

для получения более подробной информации:человек mktemp


есть ли какое-либо преимущество в создании временного файла более тщательным образом

временные файлы обычно создаются во временном каталоге (например,/tmp), где все другие пользователи и процессы имеют доступ для чтения и записи (любой другой скрипт может создавать там новые файлы). Поэтому сценарий должен быть осторожен в создании файлов, таких как использование с правильными разрешениями (например, только для чтения для владельца, см.: help umask) и имя должно быть не так легко угадать (идеально случайный). В противном случае, если имена файлов не уникальны, он может создать конфликт с одним и тем же сценарием, запущенным несколько раз (например,гонки) или какой-то злоумышленник может либо захватить некоторую конфиденциальную информацию (например, когда разрешения слишком открыты, а имя файла легко угадать), либо создать/заменить файл своей собственной версией кода (например, заменить команды или SQL-запросы в зависимости от того, что хранится).


вы можете использовать следующий подход к созданию временного каталога:

TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"

или временный файл:

TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"

однако он по-прежнему предсказуем и не считается безопасным.

по состоянию на man mktemp, мы можем читать:

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

поэтому, чтобы быть в безопасности, рекомендуется использовать mktemp команда для создания уникального временного файла или каталога (-d).