Linux создать временный файл

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

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

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

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

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

В сценарии я вызываю mktemp что-то вроде

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

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

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

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

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

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

Для более подробной информации: man mktemp

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

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

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

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

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

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

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

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

Источник

Руководство по команде mktemp с примерами для начинающих

Руководство по команде mktemp с примерами

Mktemp является частью пакета GNU coreutils.

Так что не беспокойтесь об установке.

Мы рассмотрим некоторые практические примеры

Чтобы создать новый временный файл, просто запустите:

Вы увидите вывод, как показано ниже:

Как видно из выходных данных, в каталоге / tmp создается новый временный файл со случайным именем «tmp.yjcVSaKkuv».

Читайте также:  Настройки автозапуска флешки windows

Этот файл просто пустой файл.

Как насчет временного каталога?

Да, это тоже возможно!

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

Это создаст случайный пустой каталог в папке / tmp.

Все файлы будут созданы с разрешением u + rw, а каталоги – с u + rwx, за вычетом ограничений umask.

Вы можете проверить права доступа к файлу или каталогу с помощью команды ls.

Точно так же, чтобы создать каталог, просто запустите:

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

В этом случае вам необходимо вручную очистить их.

Также, как вы могли заметить, X в имени файла заменяются случайными символами

Однако вы можете добавить любой суффикс по вашему выбору.

Теперь у нас есть суффикс «blog» в конце имени файла.

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

Для получения справки выполните:

Зачем нам на самом деле нужен mktemp?

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

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

Таким образом, нам не нужно выяснять имена.

Так как mktemp рандомизирует имена, столкновения имен не будет.

К роме того, mktemp создает файл / каталог безопасно с разрешением 600, поэтому другие пользователи не могут получить к нему доступ.

Для более подробной информации, обратитесь к справочным страницам.

Источник

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

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

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

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

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

В script я вызываю mktemp что-то вроде

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

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

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

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

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

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

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

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

Читайте также:  Аватар для папок windows

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

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

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

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

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

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

Источник

2.1.7. Временные файлы

2.1.7. Временные файлы

Иногда программе требуется создать временный файл, например для промежуточного хранения большого объема данных или для передачи данных другой программе. В системах GNU/Linux временные файлы хранятся в каталоге /tmp. Работая с временными файлами, необходимо помнить о следующих ловушках.

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

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

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

В Linux имеются функции mkstemp() и tmpfile(), решающие все вышеперечисленные проблемы. Выбор между ними делается на основании того, должен ли временный файл передаваться другой программе и какие функции ввода-вывода будут применяться при работе с файлом: низкоуровневые (read(), write() и т.д.) или потоковые (fopen(), fprintf() и т.д.).

Функция mkstemp() генерирует уникальное имя файла на основании переданного ей шаблона, создает временный файл с правами, разрешающими доступ к нему только для текущего пользователя, и открывает файл в режиме чтения/записи. Шаблон имени — это строка, оканчивающаяся последовательностью «XXXXXX» (шесть прописных букв «X»). Функция mkstemp() заменяет каждую букву произвольным символом таким образом, чтобы получилось уникальное имя, и возвращает дескриптор файла. Запись в файл осуществляется с помощью функций семейства write().

Временные файлы, создаваемые функцией mkstemp(), не удаляются автоматически. Ответственность за это возлагается на того, кто запускает программу. (Программисты должны внимательно следить за удалением временных файлов, иначе файловая система /tmp рано или поздно переполнится, приведя всю систему в нерабочее состояние.) Если файл создан для внутреннего использования и не предназначен для передачи другой программе, по окончании работы с ним нужно сразу же вызвать функцию unlink(). Она удаляет из каталога ссылку на файл, но сам файл остается до тех пор, пока не будут закрыты все ссылающиеся на него дескрипторы. Таким образом, программа может продолжать использовать временный файл; он будет удален автоматически сразу после закрытия дескриптора. Операционная система закрывает дескрипторы файлов по окончании работы программы, так что временный файл будет удален даже в случае аварийного завершения программы.

В листинге 2.5 показаны две функции, работающие с временным файлом. Будучи примененными в связке, они позволяют легко переносить содержимое буферов из операторной памяти во временный файл (это дает возможность освобождать и повторно использовать память), а затем загружать данные из файла обратно в память.

Листинг 2.5. (temp_file.c) Использование функции mkstemp()

/* дескриптор временного файла, созданного в функции

typedef int temp_file_handle;

/* Запись указанного числа байтов из буфера во временный файл.

Ссылка на временный файл немедленно удаляется. Возвращается

дескриптор временного файла. */

temp_file_handle write_temp_file(char* buffer, size_t length) <

/* Создание имени файла и самого файла. Цепочка XXXXXX будет

заменена символами, которые сделают имя уникальным. */

char temp_filename() = «/tmp/temp_file.XXXXXX»;

int fd = mkstemp(temp_filename);

/* немедленное удаление ссылки на файл, благодаря чему он будет

удален сразу же после закрытия дескриптора файла. */

/* Сначала в файл записывается число, определяющее размер

/* теперь записываем сами данные. */

write(fd, buffer, length);

/* Возвращаем дескриптор файла. */

/* Чтение содержимого временного файла, созданного в функции

write_temp_file(). Создается и возвращается буфер с содержимым

файла. Этот буфер должен быть удален в вызывающей подпрограмме

с помощью функции free(). В параметр LENGTH записывается размер

буфера в байтах. В конце временный файл удаляется. */

char* read_temp_file(temp_file_handle temp_file, size_t* length) <

/* TEMP_FILE — это дескриптор временного файла. */

int fd = temp_file;

/* переход в начало файла. */

Читайте также:  Зависает компьютер журнал событий windows

lseek(fd, 0, SEEK_SET);

/* Определение объема данных, содержащихся во временном файле. */

read(fd, length, sizeof(*length));

/* Выделение буфера и чтение данных. */

read(fd, buffer, *length);

/* Закрытие дескриптора файла, что приведет к уничтожению

Если в программе используются функции потокового ввода-вывода библиотеки языка С и передавать временный файл другой программе не нужно, то для работы с временным файлом больше подойдет функция tmpfile(). Она создает и открывает временный файл, возвращая файловый указатель на него. Ссылка на файл уже оказывается удаленной, благодаря чему он уничтожается автоматически при закрытии указателя (с помощью функции fclose()) или при завершении программы.

В Linux есть ряд других функций, предназначенных для генерирования временных файлов или их имен, в частности mktemp(), tmpnam() и tempnam(). Работать с ними нежелательно, поскольку возникают упоминавшиеся выше проблемы, связанные с надежностью и безопасностью.

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

Временные характеристики процесса

Временные характеристики процесса Воспользовавшись функцией GetProcessTimes, которая в Windows 9x отсутствует, можно получить различные временные характеристики процесса, а именно: истекшее время (elapsed time), время, затраченное ядром (kernel time), и пользовательское время (user time). BOOL

Пример: временные характеристики процессов

Пример: временные характеристики процессов Наш следующий пример (программа 6.2) представляет собой команду timep (от time print — вывод временных параметров), аналогичную UNIX-команде time (поскольку команда time поддерживается процессором командной строки, мы должны использовать для

Временные серверы для Linux

Временные серверы для Linux Сервер NTP для работы в Linux реализуется с помощью программы ntp или ее разновидностей: xntp, xntp3 и xntpd. Символ x в начале имени означает «экспериментальный» (experimental), что не совсем верно, так как эти программы успешно используются в течение нескольких лет.

7. Временные рамки

7. Временные рамки «Как сделать что-то за 15 минут» – это может быть небольшая статья, где вы даете алгоритм решения той или иной проблемы за три минуты. Это очень хорошее название для статей и видео. Вы планируете записать бесплатный каст на 15 минут, в котором

Временные диаграммы усилителей

Временные диаграммы усилителей Чтобы получить временные диаграммы синусоидального входного напряжения и напряжения на стоке, необходимо несколько изменить входной файл. Входное напряжение задается синусоидальной функциейvi 1a 0 sin (0 1mV 5kHz)Анализ переходных процессов

Временные диаграммы

Временные диаграммы Чтобы получить временные диаграммы входного и выходного напряжений, необходимо слегка изменить входной файл. Как и в предыдущем примере, будет использовано синусоидальное входное напряжение:Vi 1 0 sin (0 0. 5V 5kHz)Наряду с анализом переходных процессов

R.12.2 Временные объекты

R.12.2 Временные объекты В некоторых ситуациях транслятору бывает необходимо или удобно создавать временные объекты. Использование временных объектов зависит от реализации. Если транслятору понадобился временный объект типа класса с конструктором, он должен обеспечить

7.2.6.1. Временные файлы

7.2.6.1. Временные файлы Использование временных файлов в качестве буферов обмена данными является старейшей из существующих IPC-методик. Несмотря на недостатки, она остается удобной в сценариях командных интерпретаторов и одноразовых программах, где более сложный и

7.2.6.1. Временные файлы

7.2.6.1. Временные файлы Использование временных файлов в качестве буферов обмена данными является старейшей из существующих IPC-методик. Несмотря на недостатки, она остается удобной в сценариях командных интерпретаторов и одноразовых программах, где более сложный и

Исходные файлы и выполняемые файлы

Исходные файлы и выполняемые файлы Наша замечательная программа, несмотря на свою лаконичность и простоту, для компьютера является совершенно бессмысленным набором символов, так как он «не понимает» директив типа #include или printf. Он понимает только специальный язык,

Временные значения

Временные значения CURRENT_CONNECTION и CURRENT_TRANSACTION не имеют смысла вне текущего соединения и контекста транзакции соответственно. Сервер Firebird сохранит самые последние значения этих идентификаторов в заголовочной странице базы данных. После восстановления базы данных из

Временные таблицы

Временные таблицы Firebird не поддерживает временные таблицы, которые управляются системой. Здесь они меньше нужны, чем в других СУБД. Например, у Firebird есть возможность получать виртуальные таблицы напрямую через хранимую процедуру, написанную с использованием

Постоянные «временные» таблицы

Постоянные «временные» таблицы Популярная модель хранения временных данных для доступа приложений — определить постоянную структуру данных, которая включает «идентификатор сессии» или «идентификатор пакета», получающие значение от генератора, или, в Firebird 1.5,значение

Временные файлы проектов

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

Источник

Оцените статью