Существуют ли объективно лучшие способы создания временных файлов в скриптах bash?
Обычно я просто называю их так, как мне кажется, например, tempfile-123, так как они будут удалены после завершения скрипта. Есть ли какой-либо недостаток в этом, кроме перезаписи возможного файла tempfile-123 в текущей папке? Или есть ли преимущество в создании временного файла более осторожным способом?
tempfile(1)
в системах, которые имеют его.Ответы:
mktemp(1)
Страница людей объясняет это довольно хорошо:В сценарии я вызываю mktemp что-то вроде
который создает временный каталог, в котором я могу работать, и в котором я могу смело назвать реальные файлы чем-то читаемым и полезным.
mktemp
не является стандартным, но он существует на многих платформах. «X», как правило, преобразуются в некоторую случайность, и больше, вероятно, будет более случайным; однако некоторые системы (например, busybox ash) ограничивают эту случайность более значительно, чем другиеКстати, безопасное создание временных файлов важно не только для сценариев оболочки. Вот почему в python есть tempfile , в perl есть File :: Temp , в ruby есть Tempfile и т. Д.
источник
mktemp
в сочетании сbasename
, вот такmktemp -dt "$(basename $0). XXXXXXXXXX"
. При использовании безbasename
вас может появиться ошибка, такая как шаблон mktemp: неверный, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX ', содержит разделитель каталогов .mktemp -dt "$(basename $0).XXXXXXXXXX"
это правильный путь.$0
, в стране OS X многоmktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Да, используйте mktemp .
Он создаст временный файл в папке, предназначенной для хранения временных файлов, и гарантирует вам уникальное имя. Он выводит имя этого файла:
источник
Вы можете посмотреть на
mktemp
Для более подробной информации: man mktemp
источник
Временные файлы обычно создаются во временном каталоге (например,
/tmp
), где все другие пользователи и процессы имеют права на чтение и запись (любой другой сценарий может создавать новые файлы там). Поэтому сценарий должен быть осторожен при создании файлов, таких как использование с правильными разрешениями (например, чтение только для владельца, см .help umask
:), а имя файла не должно быть легко угадано (в идеале случайное). В противном случае, если имена файлов не являются уникальными, это может привести к конфликту с одним и тем же сценарием, запущенным несколько раз (например, условие гонки).) или злоумышленник может либо перехватить некоторую конфиденциальную информацию (например, когда права доступа слишком открыты, а имя файла легко угадать), либо создать / заменить файл собственной версией кода (например, заменить команды или запросы SQL в зависимости от того, что происходит сохранены).Вы можете использовать следующий подход для создания временного каталога:
или временный файл:
Однако это все еще предсказуемо и не считается безопасным.
Согласно
man mktemp
, мы можем прочитать:Поэтому, чтобы быть в безопасности, рекомендуется использовать
mktemp
команду для создания уникального временного файла или каталога (-d
).источник
${0##*/}
и$$
расширить, или дать ссылку на некоторую документацию по этому поводу.mktemp
является, вероятно, наиболее универсальным, особенно если вы планируете поработать с файлом некоторое время.Вы также можете использовать оператор подстановки процесса,
<()
если вам нужен только временный файл для ввода в другую команду, например:источник