
Als letzten Befehl meines decrypt.sh
Skripts wünsche ich mir, dass es im neu erstellten Ordner mit eine neue Shell erstellt unset HISTFILE
.
An diesem Punkt sollte der Benutzer in der Lage sein, mit dieser neuen Shell zu interagieren.
In diesem Ordner befindet sich ein encrypt.sh
Skript, das der Benutzer ausführen kann. Als letzte Aktion muss er den Ordner löschen und diese Shell verlassen, sodass der Benutzer zur ursprünglichen Shell zurückkehrt.
Wie kann ich das erreichen?
Während eine Bash-Lösung für mich nützlich wäre, könnte eine generische Lösung für jemand anderen nützlich sein (aber vielleicht unmöglich?).
Antwort1
Das decrypt.sh
Skript:
#!/bin/bash
# Create working directory.
tmpdir=$(mktemp -d)
# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT
# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"
# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )
Das encrypt.sh
Skript:
#!/bin/bash
# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT
# rest of script goes here
Das decrypt.sh
Skript kümmert sich um das Einrichten und Löschen des Arbeitsverzeichnisses. Das Einrichten des Verzeichnisses umfasst das Erstellen des Verzeichnisses (mit wird mktemp -d
ein temporäres Verzeichnis erstellt) und das Kopieren des encrypt.sh
Skripts dorthin, wo sich das Original befindet. Das Löschen des Arbeitsverzeichnisses erfolgt, wenn das decrypt.sh
Skript beendet wird.
Das encrypt.sh
Skript beendet seine übergeordnete Shell, wenn es selbst beendet wird, indem es ihm das HUP
Signal sendet, das das decrypt.sh
Skript auffordert, das Arbeitsverzeichnis zu entfernen. Das Verzeichnis wird auch gelöscht, wenn der Benutzer die interaktive Shell beendet, ohne auszuführen encrypt.sh
.
Anstatt zu versuchen HISTFILE
,/dev/null
nicht gesetztWenn Sie es in der erstellten interaktiven Shell verwenden, können Sie es einfach HOME
in das temporäre Verzeichnis setzen. Die Verlaufsdatei wird unter diesem Verzeichnis erstellt $HOME
und beim Beenden zusammen mit dem Verzeichnis gelöscht decrypt.sh
:
( cd "$tmpdir" && HOME="$tmpdir" bash )
Beachten Sie, dass dies das Verhalten der Tilde-Erweiterung und von cd
ohne Argument sowie von allen anderen Elementen beeinflusst, die die HOME
Variable möglicherweise verwenden.
HISTFILE
Eine weniger invasive Variante besteht darin, die Variable explizit auf einen Dateinamen im temporären Verzeichnis festzulegen :
( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )
Etwas damit verwandt: Ein Tool, das einige dieser Dinge verwendet (erstellt eine interaktive Shell in einem temporären Arbeitsverzeichnis in einer sauberen Umgebung, mit Bereinigung beim Beenden der Shell):
Haftungsausschluss: Das habe ich geschrieben.