Команда mktemp в linux

Обновлено: 05.07.2024

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

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

Справочная страница mktemp(1) довольно хорошо объясняет это:

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

В скрипте я вызываю mktemp примерно так:

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

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

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

mktemp , вероятно, наиболее универсален, особенно если вы планируете некоторое время поработать с файлом.

Вы также можете использовать оператор подстановки процесса <() , если вам нужен только временный файл в качестве входных данных для другой команды, например:

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

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

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

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

Однако это все еще предсказуемо и небезопасно.

Согласно man mktemp , мы можем прочитать:

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

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

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

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

Для получения дополнительных сведений: man mktemp.

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

Создает временный файл или директорию.

  • Создать пустой временный файл и вернуть путь к нему:
  • Создать временную директорию и вернуть путь к ней:
  • Создать временный файл с заданным расширением файла:

mkfifo

Создать FIFO файл (именованный пайп). Создать именованный пайп по заданному…

mogrify

Пакетная обработка изображений, в т.ч. изменение размера, обрезка, переворачивание, добавление…

Как получить дерево директорий на Bash одним однострочником

Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

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

Фото Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Скорее приятный, чем необходимы "трюк", но возможность использовать возможность скопировать вывод в буфер обмена – действительно круто иной раз выручает.

Фото Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Само собой, root может всё (если введёт пару команд), однако, это вполне легальный способ запретить изменение файла.

Фото Как удалить все Docker образы и контейнеры

Как удалить все Docker образы и контейнеры

Не всегда нужно удалять всё, но объяснение данного "рецепта" объяснит как в целом удалять образы и контейнеры.

Фото Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Небольшая заметка о конструкциях Bash, в которых путается большинство новичков. А именно: >, <, &, &&, |, ||

Фото Лучше плохо, но сейчас. Взгляд на пути развития ПО

Лучше плохо, но сейчас. Взгляд на пути развития ПО

Сейчас такие языки как Perl и Ruby чувствуют себя не лучшим образом. Но ещё 10 – 15 лет назад они были на "гребне волны".

Фото Как запустить программу в терминале в фоне, без вывода какого либо текста

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

Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.

Фото Малоизвестные, но полезные возможности утилиты less

Малоизвестные, но полезные возможности утилиты less

Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.

Фото Как синхронизировать локальную Git версию репозитория с серверной

Как синхронизировать локальную Git версию репозитория с серверной

Прибираемся в локальной версии Git – чтобы локальная версия соответствовала удалённой (серверной) версии Git проекта.

Фото Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.

Фото Microsoft открывает исходники, а её IDE супер-популярна

Microsoft открывает исходники, а её IDE супер-популярна

Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Фото Как на Bash получить файлы, изменённые за сегодняшний день

Как на Bash получить файлы, изменённые за сегодняшний день

Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.

Фото Как установить часовой пояс в Linux

Как установить часовой пояс в Linux

В рамках первичной настройки Операционной Системы важно установить и по какому времени вы живёте, ведь при следующем обновлении времени через Интернет ваше время слетит.

Фото Как найти самые большие папки и файлы в Linux

Как найти самые большие папки и файлы в Linux

Когда кончается место на жестком диске, возникает закономерный вопрос: на что же оно было потрачено, какие файлы разрослись больше положенного?

Фото Команда grep – полезные ключи и примеры использования

Команда grep – полезные ключи и примеры использования

У команды "grep" довольно много различных особенностей. особенно, если учесть, что с английского это "решето" – а что может войти в решето , не факт что выйдет!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mkostemp, mkstemps, mkostemps

ОБЗОР

int mkstemp(char *template);
int mkostemp(char *template, int flags);
int mkstemps(char *template, int suffixlen);
int mkostemps(char *template, int suffixlen, int flags);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200112L

mkostemp(): _GNU_SOURCE
mkstemps(): _BSD_SOURCE || _SVID_SOURCE
mkostemps(): _GNU_SOURCE

ОПИСАНИЕ

Функция mktemp() генерирует на основе шаблона template уникальное имя для временного файла, создаёт и открывает файл, после чего возвращает дескриптор открытого файла.

Последние шесть символов template должны быть равны "XXXXXX", они будут заменены на строку, которая сделает имя файла уникальным. Так как template будет меняться, он должна быть объявлен не строковой константой, а массивом символов.

Файл создается с правами 0600, то есть читать и записывать в него может только владелец. Возвращаемый дескриптор файла предоставляет доступ к файлу как на чтение, так и на запись. Файл открывается с помощью open(2) с флагом O_EXCL, что гарантирует, что вызывающий является процессом, создавшим файл.

Функция mkostemp() подобна mkstemp(), но отличие в том, что следующие биты (с теми же значениями что и для open(2)) могут быть указаны в flags: O_APPEND, O_CLOEXEC и O_SYNC. Заметим, что при создании файла mkostemp() включает значения O_RDWR, O_CREAT и O_EXCL в аргумент flags при вызове open(2); добавлять эти значения в аргумент flags при вызове mkostemp() необязательно и это приводит к ошибках в некоторых системах.

Функция mkstemps() похожа на mkstemp(), за исключением строки в template, которая содержит символы суффикса suffixlen. Таким образом, template будет приобретать вид prefixXXXXXXsuffix, а строка XXXXXX будет меняться так же, как и для mkstemp().

Функция mkostemps() является аналогом mkstemps(), подобно как mkostemp() является аналогом mkstemp().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении данные функции возвращают дескриптор временного файла. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EEXIST Невозможно создать уникальное имя временного файла. Содержимое template теперь не определено. EINVAL Для mkstemp() и mkostemp(): последние шесть символов template не равны XXXXXX. template не изменён.

Для mkstemps() и mkostemps(): количество символов template меньше, чем (6 + suffixlen) или последние 6 символов до суффикса в template не равны XXXXXX.

Данные функции также могут завершиться ошибками, описанными в open(2).

ВЕРСИИ

mkostemp() впервые появилась в glibc 2.7. mkstemps() и mkostemps() доступны в glibc с версии 2.11.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
mkstemp(), mkostemp(),
mkstemps(), mkostemps()
безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

mkstemps() не стандартизована, однако может присутствовать на некоторых системах.

mkostemp() и mkstemp(): являются расширениями glibc.

ЗАМЕЧАНИЯ

В версиях glibc 2.06 и ниже файл создавался с правами 0666, то есть читать и записывать в него могли все пользователи. Это старое поведение может быть небезопасным, особенно когда в других UNIX используются права 0600, и кто-то может не заметить это отличие при переносе программы. В POSIX.1-2008 добавлено требование, что файл должен создаваться с правами 0600.

В более общем смысле, в спецификации POSIX для mkstemp() ничего не сказано о правах на файл, поэтому программа должна сама проверить до вызова mkstemp() (и mkostemp()), что маска создания файла (смотрите umask(2)) уставлена в правильное значение.

Читайте также: