Gibt es objektiv bessere Möglichkeiten, temporäre Dateien in Bash-Skripten zu erstellen?
Normalerweise benenne ich sie einfach, was mir in den Sinn kommt, wie z. B. tempfile-123, da es gelöscht wird, wenn das Skript beendet ist. Gibt es einen anderen Nachteil, als ein mögliches tempfile-123 im aktuellen Ordner zu überschreiben? Oder hat es einen Vorteil, eine temporäre Datei sorgfältiger zu erstellen?
tempfile(1)
auf Systemen verwenden, auf denen es vorhanden ist.Antworten:
Die
mktemp(1)
Manpage erklärt es ziemlich gut:In einem Skript rufe ich so etwas wie mktemp auf
Dadurch wird ein temporäres Verzeichnis erstellt, in dem ich arbeiten kann, und in dem ich den tatsächlichen Dateien sicher etwas Lesbares und Nützliches geben kann.
mktemp
ist kein Standard, existiert aber auf vielen Plattformen. Die "X" werden im Allgemeinen in eine gewisse Zufälligkeit umgewandelt, und mehr werden wahrscheinlich zufälliger sein; Einige Systeme (zum Beispiel Busybox-Asche) begrenzen diese Zufälligkeit jedoch stärker als andereÜbrigens ist die sichere Erstellung temporärer Dateien nicht nur für Shell-Skripte wichtig. Deshalb hat Python Tempfile , Perl File :: Temp , Ruby Tempfile usw.
quelle
mktemp
in Kombination mit einerbasename
solchen istmktemp -dt "$(basename $0). XXXXXXXXXX"
. Bei Verwendung ohnebasename
diese Meldung wird möglicherweise eine Fehlermeldung wie die folgende angezeigt: mtemp: ungültige Vorlage "/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX" enthält ein Verzeichnistrennzeichen .mktemp -dt "$(basename $0).XXXXXXXXXX"
ist der richtige Weg.$0
, es gibt viele Räume im Land von OS X.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Ja, benutze mktemp .
Es wird eine temporäre Datei in einem Ordner erstellt, in dem temporäre Dateien gespeichert werden, und es wird Ihnen ein eindeutiger Name garantiert. Es gibt den Namen dieser Datei aus:
quelle
Vielleicht möchten Sie sich ansehen
mktemp
Für weitere Details: man mktemp
quelle
Die temporären Dateien werden normalerweise in dem temporären Verzeichnis (z. B.
/tmp
) erstellt, in dem alle anderen Benutzer und Prozesse Lese- und Schreibzugriff haben (jedes andere Skript kann die neuen Dateien dort erstellen). Daher sollte das Skript beim Erstellen der Dateien vorsichtig sein, z. B. mit den richtigen Berechtigungen (z. B. schreibgeschützt für den Eigentümer, siehehelp umask
:)), und der Dateiname sollte nicht leicht zu erraten sein (idealerweise zufällig). Wenn die Dateinamen nicht eindeutig sind, kann dies zu Konflikten mit demselben Skript führen, das mehrmals ausgeführt wurde (z. B. Race-Bedingung)) oder ein Angreifer könnte entweder vertrauliche Informationen entführen (z. B. wenn die Berechtigungen zu offen sind und der Dateiname leicht zu erraten ist) oder die Datei durch eine eigene Version des Codes erstellen / ersetzen (z. B. das Ersetzen der Befehle oder SQL-Abfragen, je nachdem, was gerade ist) gelagert).Sie können den folgenden Ansatz verwenden, um das temporäre Verzeichnis zu erstellen:
oder temporäre Datei:
Es ist jedoch immer noch vorhersehbar und wird nicht als sicher angesehen.
Laut
man mktemp
können wir lesen:Aus Sicherheitsgründen wird empfohlen, den
mktemp
Befehl zum Erstellen einer eindeutigen temporären Datei oder eines eindeutigen Verzeichnisses (-d
) zu verwenden.quelle
${0##*/}
und zu$$
erweitern oder auf eine Dokumentation darüber zu verlinken.mktemp
ist wahrscheinlich die vielseitigste, insbesondere wenn Sie vorhaben, eine Weile mit der Datei zu arbeiten.Sie können auch einen Prozessersetzungsoperator verwenden,
<()
wenn Sie die Datei nur vorübergehend als Eingabe für einen anderen Befehl benötigen, z.quelle