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

Обновлено: 03.07.2024

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

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

Как это сделать в сценарии оболочки?

Вы можете убедиться, что файл удаляется при выходе из сценария (включая убийства и сбои), открыв файловый дескриптор файла и удалив его. Файл остается доступным (для сценария; на самом деле не для других процессов, но /proc/$PID/fd/$FD является обходным путем), пока дескриптор файла открыт. Когда он закрывается (что делает ядро ​​автоматически при выходе из процесса), файловая система удаляет файл.

Хороший ответ, элегантное решение с файловым дескриптором в случае сбоя +1 что делает exec 3> "$tmpfile" ? Разве это не полезно, если tmpfile - это отдельный скрипт? «Вы можете использовать кошку <3 или что-то подобное». на самом деле это читает из файла с именем 3 @ dragon788. Также cat <&3 даст Bad file descriptor . Буду признателен, если вы исправите или удалите это; дезинформация не очень помогает.

Используйте mktemp для создания временного файла или каталога:

Или для направления:

В конце скрипта вы должны удалить временный файл / dir:

mktemp создает файл в /tmp каталоге или в каталоге, указанном с --tmpdir аргументом.

Вы можете использовать trap "rm -f $temp_file" 0 2 3 15 сразу после создания файла, чтобы при выходе из скрипта или его остановке ctrl-C файл все равно удалялся. @wurtel Что произойдет, если EXIT это единственный крюк для trap ? @HaukeLaging Тогда ловушка не срабатывает, если скрипт останавливается с помощью Ctrl + C. Следует отметить, что TRAP не поможет, если вы kill -9 $somepid . Этот конкретный сигнал убийства - insta-death, и больше ничего не происходит. @ dragon788 Вы пробовали это? Вам следует. bash -c 'echo $$; trap "echo foo" 0; sleep 5'

С помощью POSIX toolchest:

Что произойдет, если EXIT это единственный крюк для trap ? @HaukeLaging: по- tmpfile прежнему удаляется до выхода из скрипта, но не тогда, когда скрипт получает другие сигналы. Это не то, что здесь происходит (GNU bash, версия 4.2.53). @HaukeLaging: Что ты имеешь в виду That's not what happens ?

Некоторые оболочки имеют встроенную функцию.

zsh «s =(. ) форма замещения процесса использует временный файл. Например, =(echo test) раскрывается путь к временному файлу, который содержит test\n .

Этот файл автоматически удаляется после завершения команды.

bash / zsh в Linux

Здесь-файлы или здесь-строки в bash и zsh реализуются как удаленные временные файлы.

Так что если вы делаете:

Файловый дескриптор 3 связан с удаленным временным файлом, который содержит test\n .

Вы можете получить его содержание с:

Если в Linux вы также можете читать или записывать в этот файл через /dev/fd/3

(некоторые другие оболочки используют трубы, или могут использовать, /dev/null если документ здесь пуст).

POSIX

mktemp Утилиты POSIX нет . Однако в POSIX указан mkstemp(template) API C , а m4 стандартная утилита предоставляет этот API с mkstemp() функцией m4 с тем же именем.

mkstemp() дает вам имя файла со случайной частью, которая гарантированно не существовала во время вызова функции. Он создает файл с разрешениями 0600 без участия гонок.

Итак, вы можете сделать:

Тем не менее, обратите внимание, что вам нужно выполнить очистку при выходе, хотя, если вам нужно только записать и прочитать файл фиксированное количество раз, вы можете открыть и удалить его сразу после создания, как для here-doc / here- Струнный подход выше:


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

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

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

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

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

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

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

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

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

Как я уже сказал, все файлы и каталоги создаются со случайными именами файлов. Мы также можем создать временный файл или каталог с произвольным именем. Для этого просто добавьте как минимум 3 последовательных символа X в конце имени файла, как показано ниже.

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

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

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

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

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

Например, я хочу добавить «blog» в конце имени файла. Следовательно, моя команда будет:

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

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

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

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

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

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

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

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

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

Иногда программе требуется создать временный файл, например для промежуточного хранения большого объема данных или для передачи данных другой программе. В системах 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, &length, sizeof(length));

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

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;

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

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 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-методик. Несмотря на недостатки, она остается удобной в сценариях командных интерпретаторов и одноразовых программах, где более сложный и

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

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

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

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

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

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

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

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

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

есть ли объективно лучшие способы создания временных файлов в сценариях 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 ).

Есть ли объективно лучшие способы создания временных файлов в сценариях 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.

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

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