Linux create temp file

Creating temporary files in bash

Are there objectively better ways to create temporary files in bash scripts? I normally just name them whatever comes to my mind, such as tempfile-123, since it will be deleted when the script is over. Is there any disadvantage in doing this other than overwriting a possible tempfile-123 in current folder? Or is there any advantage in creating a temporary file in a more careful way?

Don’t use temporally files. Use temporally directories instead. And don’t use mktemp. See here why: codeproject.com/Articles/15956/…

@ceving That article is simply wrong, at least when applied to the shell command mktemp (as opposed to the mktemp library call). As mktemp creates the file itself with a restrictive umask, the attack given only works if the attacker is operating under the same account as the attackee. in which case the game is already lost. For best practices in the shell-scripting world, see mywiki.wooledge.org/BashFAQ/062

7 Answers 7

The mktemp(1) man page explains it fairly well:

Traditionally, many shell scripts take the name of the program with the pid as a suffix and use that as a temporary file name. This kind of naming scheme is predictable and the race condition it creates is easy for an attacker to win. A safer, though still inferior, approach is to make a temporary directory using the same naming scheme. While this does allow one to guarantee that a temporary file will not be subverted, it still allows a simple denial of service attack. For these reasons it is suggested that mktemp be used instead.

In a script, I invoke mktemp something like

mydir=$(mktemp -d "$$(basename $0).XXXXXXXXXXXX") 

which creates a temporary directory I can work in, and in which I can safely name the actual files something readable and useful.

mktemp is not standard, but it does exist on many platforms. The «X»s will generally get converted into some randomness, and more will probably be more random; however, some systems (busybox ash, for one) limit this randomness more significantly than others

By the way, safe creation of temporary files is important for more than just shell scripting. That’s why python has tempfile, perl has File::Temp, ruby has Tempfile, etc…

It seems the most safe and most cross-platform way to use mktemp is in combination with basename , like so mktemp -dt «$(basename $0). XXXXXXXXXX» . If used without basename you might get an error like this mktemp: invalid template, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX’, contains directory separator.

@i4niac: you need to quote that $0 , there are spaces a plenty in the land of OS X. mktemp -dt «$(basename «$0″).XXXXXX»

Читайте также:  Ttl linux mint изменить

Also it may be nice to remove the tempdir at the end of the script execution: trap «rm -rf $mydir» EXIT

It will create a temporary file inside a folder that is designed for storing temporary files, and it will guarantee you a unique name. It outputs the name of that file:

You might want to look at mktemp

The mktemp utility takes the given filename template and overwrites a portion of it to create a unique filename. The template may be any filename with some number of ‘Xs’ appended to it, for example /tmp/tfile.XXXXXXXXXX. The trailing ‘Xs’ are replaced with a combination of the current process number and random letters.

Is there any advantage in creating a temporary file in a more careful way

The temporary files are usually created in the temporary directory (such as /tmp ) where all other users and processes has read and write access (any other script can create the new files there). Therefore the script should be careful about creating the files such as using with the right permissions (e.g. read only for the owner, see: help umask ) and filename should be be not easily guessed (ideally random). Otherwise if the filenames aren’t unique, it can create conflict with the same script ran multiple times (e.g. race condition) or some attacker could either hijack some sensitive information (e.g. when permissions are too open and filename is easy to guess) or create/replacing the file with their own version of the code (like replacing the commands or SQL queries depending on what is being stored).

You could use the following approach to create the temporary directory:

However it is still predictable and not considered safe.

As per man mktemp , we can read:

Traditionally, many shell scripts take the name of the program with the pid as a suffix and use that as a temporary file name. This kind of naming scheme is predictable and the race condition it creates is easy for an attacker to win.

So to be safe, it is recommended to use mktemp command to create unique temporary file or directory ( -d ).

It does improve the answer indeed. My upvote was already yours, though. Can’t vote more. One suggestion I have is to explain what $ and $$ expand to, or link to some documentation about it.

@jpbochi $ is the file name of the script that is currently running and $$ is its process id. Generally, I don’t think this solution is a good approach because it can leave hidden files and folders in various directories the script is being executed from. The temporary files and folders can be deleted afterward, but if the script is halted (using CTRL-C ), then the they will remain. It’s better practice to use mktemp because it creates temporary files in the system’s temporary folder.

mktemp is probably the most versatile, especially if you plan to work with the file for a while.

Читайте также:  You are an idiot linux

To somewhat expand on previous answers here, you want to run mktemp and make sure you also clean up afterwards. The usual way to do that is with trap , which lets you set up a hook that can be run when your script is interrupted.

Bash also provides the EXIT pseudo-signal so that you can set up a trap to be run when your script exits successfully, and ERR which triggers if your script produces an error. (See also What does set -e mean in a bash script? for some unobvious consequences.)

t=$(mktemp -d -p temporary.XXXXXXXXXXXX) || exit trap 'rm -rf "$t"; exit' ERR EXIT # HUP INT TERM : # use "$t" to your heart's content . 

You might want to set up additional signals besides ERR and EXIT ; obviously, kill -9 cannot be trapped (which is why it should not be used, except in emergencies). HUP (signal 1) and INT (signal 2) are generated when your script’s session is hung up, or the user presses ctrl-C, respectively. TERM (signal 15) is the default signal sent by kill , and requests the script to be terminated.

mktemp -p replaces mktemp -t which is regarded as obsolete. The -d option says to create a directory; if you only need a single temporary file, obviously, that’s not necessary.

Источник

Учебное пособие по команде Linux mktemp для начинающих (5 примеров)

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

В этом уроке мы обсудим основы команды mktemp, используя несколько простых для понимания примеров. Но прежде чем мы это сделаем, стоит упомянуть, что все приведенные здесь примеры были протестированы на компьютере с Ubuntu 20.04 LTS и на Debian 10.

Команда Linux mktemp

Команда mktemp в Linux позволяет пользователям создавать временный файл или каталог. Ниже приведен его синтаксис:

И вот как это объясняет справочная страница инструментов:

Create a temporary file or directory, safely, and print its name. TEM? 
PLATE 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 restric?
tions.

Ниже приведены несколько примеров в стиле вопросов и ответов, которые должны дать вам хорошее представление о том, как работает команда mktemp.

Q1. Как создать временный файл с помощью mktemp?

Простой. Просто выполните mktemp без каких-либо опций. Вы увидите, что в папке /tmp/ будет создан временный файл.

Например, в моем случае был получен следующий вывод:

Q2. Как создать временный каталог с помощью mktemp?

Это можно сделать с помощью параметра командной строки -d.

Например, в моем случае был получен следующий вывод:

Итак, вы видите, имя не отражает тот факт, что это каталог, но на самом деле это так.

Q3. Как дать собственное имя вашему временному файлу/каталогу?

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

Читайте также:  Xrdp windows to linux

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

Например, я выполнил следующую команду:

И был создан следующий файл:

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

Q4. Как добавить суффикс в конец имени файла/каталога?

В предыдущем разделе мы обсуждали, как получить пользовательское имя при использовании mktemp. Но таким образом вы можете иметь только начальную часть имени по желанию. Что делать, если вы хотите, чтобы суффикс по вашему выбору, а также?

Вы будете рады узнать, что это также возможно. Вам просто нужно использовать опцию —suffix. Ниже приведен пример:

mktemp tempfileXXX --suffix=HTF

А вот имя файла, созданного вышеупомянутой командой:

Таким образом, вы можете видеть, что указанный вами суффикс был добавлен к имени файла.

Q5. Как просто выполнить пробный прогон с mktemp?

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

Заключение

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

Источник

Make a temporary file on Linux with Bash

The mktemp command on Fedora-based systems and tempfile on Debian-based systems are specially designed to alleviate that burden by making it easy to create, use, and remove unique files.

bash logo on green background

When programming in the Bash scripting language, you sometimes need to create a temporary file. For instance, you might need to have an intermediary file you can commit to disk so you can process it with another command. It’s easy to create a file such as temp or anything ending in .tmp . However, those names are just as likely to be generated by some other process, so you could accidentally overwrite an existing temporary file. And besides that, you shouldn’t have to expend mental effort coming up with names that seem unique. The mktemp command on Fedora-based systems and tempfile on Debian-based systems are specially designed to alleviate that burden by making it easy to create, use, and remove unique files.

Create a temporary file

Both mktemp and tempfile create a temporary file as their default action and print the name and location of the file as output:

$ tempfile /tmp/fileR5dt6r $ mktemp /tmp/tmp.ojEfvMaJEp

Unless you specify a different path, the system places temporary files in the /tmp directory. For mktemp , use the -p option to specify a path:

$ mktemp -p ~/Demo /home/tux/Demo/tmp.i8NuhzbEJN

For tempfile , use the —directory or -d option:

$ tempfile --directory ~/Demo/ /home/sek/Demo/fileIhg9aX

Источник

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