14

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

3 ответа3

15

А? От man mktemp:

DESCRIPTION
   Create  a  temporary  file  or directory, safely, and
   print its name.  TEMPLATE must  contain  at  least  3
   consecutive  `X's  in last component.  If TEMPLATE is
   not specified, use tmp.XXXXXXXXXX,  and  --tmpdir  is
   implied.   Files  are  created  u+rw, and directories
   u+rwx, minus umask restrictions.

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


Поскольку, кажется, есть немного аргумента, давайте вдаваться в некоторые детали. Страница mktemp гласит, что

если TEMPLATE не указан, предполагается --tmpdir , если --tmpdir не указан, предполагается /tmp .

Это означает, что простой запуск mktemp создаст файл с именем tmp.RANDOM_STRING в каталоге /tmp. Так что да, запуск mktemp без параметров создаст файл, который будет очищен вместе со всем остальным в /tmp в зависимости от системы. Для таких файлов важна переменная $TMPTIME , как объяснено в ответе Криса ниже. Для многих дистрибутивов по умолчанию очищается /tmp при каждой загрузке, потому что $TMPTIME имеет значение 0 . В большинстве (если не во всех) дистрибутивах это устанавливается в файле /etc/default/rcS:

$ grep TMPTIME /etc/default/rcS
TMPTIME=0

Теперь, если вы задаете шаблон, например mktemp fooXXX то файл с именем fooXXX создается в текущем каталоге , где XXX заменяется тремя случайными символами. Этот файл никогда не будет удален, если вы специально не сделаете это. Только файлы в "официальных" временных каталогах, таких как /tmp , когда-либо автоматически удаляются системой, нет никакого волшебного бита, который вы можете установить, который указывает временный файл, файлы вне /tmp и тому подобное не удаляются автоматически.

Чтобы ответить на ваш главный вопрос, конечно, странно зависеть от файла, который может исчезнуть, поэтому люди не зависят от файлов tmp, они созданы для временного хранения данных, и тогда мы можем забыть о них. Существует много способов создания постоянного файла со случайным именем. Например:

echo "foo" > $RANDOM.txt
echo "foo" > `mktemp fooXXX.txt`
echo "foo" > $$.txt
6

Помните, что временные файлы могут быть удалены во время загрузки системы или в соответствии с TMPTIME. Пожалуйста, посмотрите, что у вас есть в /etc/cron.daily/tmpwatch .

/var/tmp/ с другой стороны, обычно невосприимчив к tmpwatch .

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

Вам не нужно создавать временный файл в /tmp

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .