Linux / Befehl mktemp: Sichere temporäre Dateien und Verzeichnisse erstellen

mktemp erstellt eine temporäre Datei oder ein temporäres Verzeichnis mit einem unvorhersehbaren Namen und gibt den Pfad aus. Speichern Sie diesen Pfad, prüfen Sie den Erfolg und richten Sie das Aufräumen ein. Die Option -u erstellt kein Objekt und eignet sich nicht als Grundlage für eine sichere spätere Erstellung.

Die Beispiele verwenden das Verhalten von GNU Coreutils. Prüfen Sie mktemp --help, man mktemp und die Dokumentation Ihrer Distribution, wenn Portabilität oder eine versionsspezifische Option wichtig ist.

Ergänzende Befehle und Anwendungsfälle finden Sie in Wesentliche Linux-Befehle: Eine praktische Referenz nach Aufgaben.

Was ist der Befehl mktemp?

mktemp erstellt atomar eine temporäre Datei oder ein Verzeichnis mit einem unvorhersehbaren eindeutigen Namen und gibt diesen Pfad aus. Dies vermeidet die vorhersehbaren Namenskonflikte, die häufig in Skripten auftreten, die einen Programmnamen mit einer Prozess-ID kombinieren.

Grundlegende Syntax

mktemp [OPTION]... [TEMPLATE]

Setzen Sie Anführungszeichen um Pfade, die Leerzeichen enthalten. Wenn unterstützt, setzen Sie -- vor Operanden, die mit einem Bindestrich beginnen, damit sie nicht als Optionen interpretiert werden.

Grundlegende mktemp-Verwendung

Erstelle eine temporäre Datei

Ohne Vorlage verwendet mktemp die Richtlinie des System-Temporärverzeichnisses, erstellt die Datei und gibt deren Pfad aus. Beenden Sie, wenn die Erstellung fehlschlägt.

tmp_file=$(mktemp) || exit 1
printf '%s\n' "$tmp_file"

Wählen Sie ein Dateinamensmuster

Eine Vorlage endet mit einer Reihe von X-Zeichen, die mktemp ersetzt. Ein Suffix kann abgeleitet oder ausdrücklich angegeben werden.

mktemp report-XXXXXXXX.csv
mktemp --suffix=.log app-XXXXXXXX

Erstellen Sie ein temporäres Verzeichnis

Verwenden Sie -d für einen privaten temporären Arbeitsbereich. Eine strengere umask kann dessen Berechtigungen weiter einschränken.

tmp_dir=$(mktemp -d) || exit 1
printf '%s\n' "$tmp_dir"

Überprüfung des tatsächlichen Erstellungswegs

mktemp gibt den Pfad der sicher erstellten temporären Datei auf der Standardausgabe zurück. Schätzen Sie den Namen nicht, um sie zu erstellen, und verlassen Sie sich nicht nur auf das -u-Ergebnis.

tmpfile=$(mktemp)
printf '%s\n' "$tmpfile"
test -f "$tmpfile"
echo $?

Die Ausgabe ist eine Zeile mit dem temporären Pfad und 0. Der String des temporären Pfads unterscheidet sich bei jeder Ausführung. Sobald die Aufgabe abgeschlossen ist, stellen Sie sicher, dass es sich um die Datei handelt, die Sie tatsächlich erstellt haben, und räumen Sie den in Anführungszeichen eingeschlossenen Variablenpfad auf.

Wichtige Optionen

Option Zweck
-d Erstellen Sie ein Verzeichnis anstelle einer Datei.
-p DIR Erstellen Sie aus einer Vorlage relativ zum ausgewählten Verzeichnis.
--tmpdir Verwenden Sie TMPDIR oder das Standard-Temporärverzeichnis, wenn kein Argument angegeben ist.
--suffix=SUFFIX Hängen Sie einen Suffix ohne Schrägstrich an.
-q Unterdrücken Sie Diagnosen, während der Fehlerstatus beibehalten wird.
-u Drucken Sie einen ungenutzten Namen, ohne ihn zu erstellen; unsicher für spätere sichere Erstellung.

Lange Optionen machen überprüfte Skripte oft leichter verständlich. Wenn ein Skript auf Nicht-GNU-Systemen laufen muss, überprüfen Sie jede nicht-POSIX-Option auf der Zielplattform.

Praktische Beispiele

Räumen Sie eine temporäre Datei mit Trap auf

Registrieren Sie unmittelbar nach erfolgreicher Erstellung einen Aufräum-Handler. Zitieren Sie jede Pfadvariable und verwenden Sie --, wo unterstützt.

tmp_file=$(mktemp) || exit 1
trap 'rm -f -- "$tmp_file"' EXIT HUP INT TERM

printf '%s\n' 'temporary data' > "$tmp_file"

Verwenden Sie ein temporäres Arbeitsverzeichnis

Wenn mehrere Zwischendateien benötigt werden, erstellen Sie ein privates Verzeichnis und verwenden Sie nur feste Namen innerhalb dieses Verzeichnisses.

work_dir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$work_dir"' EXIT HUP INT TERM

input=$work_dir/input
output=$work_dir/output

Wählen Sie das übergeordnete Verzeichnis

Verwenden Sie -p, wenn temporäre Daten auf einem bestimmten Dateisystem gespeichert werden müssen. Das übergeordnete Verzeichnis muss bereits existieren und geeignete Berechtigungen haben.

mkdir -p "$HOME/.cache/myapp"
cache_file=$(mktemp -p "$HOME/.cache/myapp" cache-XXXXXXXX) || exit 1

mktemp und verwandte Befehle

Befehl oder Methode Hauptrolle Geeignet für
mktemp Erstellen Sie einen eindeutigen Namen und ein Objekt atomar Sichere temporäre Dateien und Verzeichnisse
touch Erstellen Sie einen gewählten festen Dateinamen Gewöhnliche Dateien ohne Namenskonflikte
mkdir Erstellen Sie einen gewählten Verzeichnisnamen Dauerhafte oder vorherbestimmte Pfade
mktemp -u Drucken Sie nur einen derzeit unbenutzten Namen Nicht geeignet für sichere spätere Erstellung

Wichtige Hinweise

Erstellen Sie später keine Datei aus der mktemp -u-Ausgabe

Ein anderer Prozess kann den Namen zwischen Auswahl und Verwendung beanspruchen. Lassen Sie mktemp das Objekt selbst erstellen.

Variablen für Bereinigungsbefehle zitieren

Ein leerer oder getrennter Pfad kann dazu führen, dass ein Bereinigungsbefehl auf die falsche Stelle zeigt. Überprüfen Sie die Erstellung und setzen Sie die Variable jedes Mal in Anführungszeichen.

Wissen, wo sensible temporäre Daten gespeichert werden

Das temporäre Verzeichnis kann auf einer Festplatte, im Swap, als Snapshot oder gesichert sein. Wenden Sie eine separate Datenhandhabungsrichtlinie für Geheimnisse an.

FAQ

Warum ist mktemp sicherer als die Hinzufügung einer Prozess-ID zu einem Namen?

Es wählt einen unvorhersehbaren Namen und erstellt das Objekt atomar, wodurch Namenskonflikte und Symlink-Rennen reduziert werden.

Wie erstelle ich ein temporäres Verzeichnis?

Verwenden Sie mktemp -d und speichern Sie den ausgegebenen Pfad in einer in Anführungszeichen gesetzten Variable.

Werden temporäre Dateien automatisch entfernt?

Normalerweise nicht. Registrieren Sie das Aufräumen mit trap in einem Shell-Skript.

Wann wird TMPDIR verwendet?

Es kann das übergeordnete Verzeichnis auswählen, das vom Standard-Template oder --tmpdir verwendet wird. Überprüfen Sie die installierte Version für das genaue Verhalten.

Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Coreutils mktemp Dokumentation und GNU Coreutils-Handbuch.