Verwenden Sie das mktempDienstprogramm, um eine temporäre Datei mit einem unvorhersehbaren Namen zu erstellen. Es ist nicht von POSIX standardisiert, aber sowohl auf * BSD als auch auf Linux verfügbar.
> /tmp/predictable.$RANDOMDies ist keine gute Wahl, da es meistens vorhersehbar ist¹, wodurch Ihr Skript für einen Angriff geöffnet wird, bei dem der Angreifer Ihr Skript dazu verleiten kann, eine Datei zu überschreiben, auf die Sie Schreibzugriff haben, oder ihnen Zugriff auf die temporäre Datei zu gewähren. Dies ist eine unsichere Sicherheitsanfälligkeit für temporäre Dateien . mktemphat diese Sicherheitsanfälligkeit nicht, da die Datei sicher erstellt wird (es wird keine vorhandene Datei überschrieben, auch wenn symbolische Links vorhanden sind) und ein ausreichend unvorhersehbarer Name verwendet wird, um einen Denial-of-Service zu vermeiden.
Wenn es nicht gut genug ist, eine temporäre Datei zu erstellen und damit zu arbeiten, erstellen Sie ein temporäres Verzeichnis mit mktemp -dund arbeiten Sie dort.
mktempEs wird auch darauf geachtet, $TMPDIRwenn die Variable gesetzt ist, und auf zurückzugreifen, /tmpwenn sie nicht gesetzt ist.
Immer mehr Distributionen TMPDIRwerden als privates Verzeichnis eingerichtet, z. B. /run/1234/tmpwo 1234ist Ihre UID. Hierdurch wird das Risiko von Sicherheitslücken in Bezug auf temporäre Dateien beseitigt, da temporäre Dateien nicht mehr zwischen Benutzern ausgetauscht werden können (was gelegentlich nützlich ist, aber nicht sehr häufig; /tmpist immer noch verfügbar, nur nicht TMPDIR).
Wenn Sie einen reproduzierbaren Dateinamen benötigen, erstellen Sie eine Datei mit einem genau definierten Namen (ohne zufällige Komponente) im Basisverzeichnis des Benutzers. Die moderne Konvention ist die XDG-Benutzerverzeichnisspezifikation . Wenn die Datei ohne Datenverlust entfernt werden konnte, verwenden Sie die XDG_CACHE_HOMEUmgebungsvariable mit dem Standardwert "" ~/.cache. Sie sollten wahrscheinlich ein nach Ihrer Anwendung benanntes Unterverzeichnis erstellen und dort arbeiten.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹ Nimmt nicht $RANDOMnur 32767 mögliche Werte an, sondern ist auch leicht vorherzusagen, ohne viele Werte auszuprobieren. Der Zufallszahlengenerator von Bash ist eine LCG , die nach PID und Zeitpunkt der ersten Verwendung geimpft wird. Zsh ist der Startzeitpunkt der Plattform rand. ATT Ksh's ist die Plattform, die randvon PID geimpft wird. Mkshs ist eine LCG mit einem komplexeren, aber immer noch nicht sicherheitsrelevanten Saatgut. Alle von ihnen können durch einen anderen Prozess mit einer ziemlich großen Erfolgschance vorhergesagt werden.
$TMPDIRund~/.cachegenau das, was ich brauchte. Nach einigen weiteren Überlegungen wurde mir klar, dass der einzige Grund, warum ich es wollte,/tmpdie Partitionierung war - also konnte der Cache die/homePartition nicht füllen . Aber für diesen Anwendungsfall ist das wirklich kein Problem, sodass ein Unterverzeichnis~/.cachemeiner Anforderungen perfekt entspricht und die Sicherheitslücke schließt.