Können wir temporäre Ordner wie temporäre Dateien verwenden?
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
Was wird nach diesem Shell-Exit automatisch zerstört?
file-descriptors
tmpfs
Bob Johnson
quelle
quelle
Antworten:
Im Fall einer temporären Datei würde Ihr Beispiel in der Frage sie erstellen und dann die Verknüpfung zum Verzeichnis aufheben (wodurch sie "verschwindet"). Wenn das Skript den Dateiskriptor schließt (wahrscheinlich nach Beendigung), wird der von der Datei belegte Speicherplatz belegt würde vom System zurückgefordert werden. Dies ist eine übliche Methode, um mit temporären Dateien in Sprachen wie C umzugehen.
Soweit ich weiß, ist es nicht möglich, ein Verzeichnis auf die gleiche Weise zu öffnen, zumindest nicht auf eine Weise, die das Verzeichnis nutzbar machen würde.
Eine übliche Methode zum Löschen temporärer Dateien und Verzeichnisse beim Beenden eines Skripts ist die Installation einer Bereinigungsfalle
EXIT
. Die unten angegebenen Codebeispiele vermeiden, dass Dateideskriptoren vollständig jongliert werden müssen.Oder Sie können eine Bereinigungsfunktion aufrufen:
Der
EXIT
Trap wird beim Empfang desKILL
Signals (das nicht abgefangen werden kann) nicht ausgeführt , was bedeutet, dass dann keine Bereinigung durchgeführt wird. Es wird jedoch ausgeführt, wenn es aufgrund einesINT
oderTERM
-Signals beendet wird (wenn es mitbash
oder ausgeführt wirdksh
, in anderen Shells möchten Sie diese Signale möglicherweise nachEXIT
dertrap
Befehlszeile hinzufügen ) oder wenn es normal beendet wird, weil es am Ende des Skripts ankommt oder ein ausführtexit
Anruf.quelle
.
und..
Einträge. (Getestet unter Linux, ich weiß nicht, ob das plattformübergreifend konsistent ist.)exec another-command
offensichtlich aufruft .Schreiben Sie eine Shell-Funktion, die ausgeführt wird, wenn Ihr Skript fertig ist. Im folgenden Beispiel nenne ich es "Aufräumen" und setze einen Trap, der auf Exit-Ebenen ausgeführt werden soll, wie: 0 1 2 3 6
Weitere Informationen finden Sie in diesem Beitrag.
quelle
cleanup
vor einem sauberen Ausgang (0) und beim Empfang von SIGHUP (1), SIGINT (2), SIGQUIT (3) und SIGABRT (6). Es wird nicht ausgeführt,cleanup
wenn das Skript aufgrund von SIGTERM, SIGSEGV, SIGKILL, SIGPIPE usw. beendet wird. Dies ist eindeutig mangelhaft.Sie können chdir hinein und dann entfernen, vorausgesetzt, Sie versuchen danach nicht, Pfade darin zu verwenden:
Ich habe nicht überprüft, aber es ist höchstwahrscheinlich das gleiche Problem, wenn openat (2) in C mit einem Verzeichnis verwendet wird, das nicht mehr im Dateisystem vorhanden ist.
Wenn Sie root und unter Linux sind, können Sie mit einem separaten Namespace und
mount -t tmpfs tmpfs /dir
darin spielen.Die kanonischen Antworten (setzen Sie eine Falle auf EXIT) funktionieren nicht, wenn Ihr Skript in einen unreinen Exit gezwungen wird (z. B. mit SIGKILL); Dadurch können vertrauliche Daten hängen bleiben.
Aktualisieren:
Hier ist ein kleines Dienstprogramm, das den Namespace-Ansatz implementiert. Es sollte mit kompiliert werden
und gegebene
CAP_SYS_ADMIN
Dateifunktionen (als root) mitBeim Ausführen (als normaler) Benutzer als
Der Dateisystem-Namespace wird freigegeben, ein tmpfs-Dateisystem wird gemountet
/proc/sysvipc
, chdir wird eingefügt undcommand
mit den angegebenen Argumenten ausgeführt.command
wird die Fähigkeiten nicht erbenCAP_SYS_ADMIN
.Auf dieses Dateisystem kann nicht über einen anderen Prozess zugegriffen werden, der nicht gestartet wurde
command
, und es verschwindet auf magische Weise (mit allen darin erstellten Dateien), wenncommand
und seine Kinder sterben, egal wie das passiert. Beachten Sie, dass dies nur die Freigabe des Mount-Namespace aufhebt. Es gibt keine harten Barrieren zwischencommand
und anderen Prozessen, die vom selben Benutzer ausgeführt werden. sie konnten nach wie vor in seinem Namensraum schleichen entweder überptrace(2)
,/proc/PID/cwd
oder mit anderen Mitteln.Die Entführung der "Nutzlosen"
/proc/sysvipc
ist natürlich albern, aber die Alternative wäre gewesen,/tmp
mit leeren Verzeichnissen zu spammen , die entfernt werden müssten, oder dieses kleine Programm mit Gabeln und Wartezeiten erheblich zu komplizieren. Alternativdir
kann z./mnt/chtmp
und lassen Sie es bei der Installation von root erstellen; Machen Sie es nicht vom Benutzer konfigurierbar und setzen Sie es nicht auf einen benutzereigenen Pfad, da Sie dadurch möglicherweise Symlink-Fallen und anderen haarigen Dingen ausgesetzt werden, für die es sich nicht lohnt, Zeit zu investieren.chtmp.c
quelle
rm $PWD
Arbeit, befindet sich die Shell immer noch in diesem Verzeichnis. Es können jedoch keine neuen Dateien in diesen "Ordner" gelegt werden. Sie können nur mit den Dateien & 3, & 4 lesen / schreiben. Dies ist also immer noch "temporäre Datei", nicht "temporärer Ordner".Benötigen Sie eine bestimmte Shell?
Wenn zsh eine Option ist, lesen Sie bitte
zshexpn(1)
:Zum Beispiel verwende ich dies in Rifle (Teil des Ranger-Dateimanagers), um eine Datei zu entschlüsseln und dann das Gewehr für die temporäre Datei auszuführen, die gelöscht wird, wenn die Unterprozesse beendet werden. (nicht vergessen zu setzen
$TERMCMD
)quelle