Gibt es eine Möglichkeit, zu verhindern, dass ein Befehl zu Ihrem Verlauf hinzugefügt wird?

65

Gibt es eine Möglichkeit, zu verhindern, dass ein Befehl zu Ihrem Verlauf hinzugefügt wird? Ich habe einen Befehl, den ich aus meiner Verlaufsdatei entfernen möchte, und es ist mir wirklich egal, wenn ich den im Speicher abgelegten Verlauf durchsuche, obwohl das weniger bedenklich ist. Gibt es eine Möglichkeit, dies zu verhindern, oder muss ich einfach zurückgehen und meine Verlaufsdatei bearbeiten.

update: Ich wusste nicht, dass dies Shell-spezifisch sein könnte. Meine Muschel ist zsh. Sie können gerne für andere Shells antworten, damit die Leute wissen, wie dies in ihrer Shell gemacht wird.

Xenoterracid
quelle
Vernetzung zu zsh Antwort: superuser.com/questions/352788/...
Michael Shigorin

Antworten:

52

In ZSH :

Zuerst fügen Sie setopt HIST_IGNORE_SPACEzu Ihrem ~/.zshrc. Nachdem Sie sich erneut angemeldet haben, können Sie Befehlen, die nicht im Verlauf gespeichert werden sollen, das Präfix a voranstellen space.

In der Bedienungsanleitung können die folgenden 3 Optionen verwendet werden, um anzugeben, dass bestimmte Zeilen überhaupt nicht in den Verlauf aufgenommen werden sollen:

  • HIST_IGNORE_SPACE speichert keine Befehle, denen ein Leerzeichen vorangestellt ist
  • HIST_NO_STORE speichert keinen Verlaufsbefehl ( fc -l )
  • HIST_NO_FUNCTIONS speichert keine Funktionsdefinitionen
Dogbane
quelle
funktioniert irgendeine chance @mmckinst antwort in zsh? oder so ähnlich? oder vielleicht ein Befehl, der den Befehl enthält| somecommand
Xenoterracide
AFAIK, es gibt kein Äquivalent zu Bashs HISTIGNORE in zsh.
Dogbane
@xeno zsh bietet eine Hook-Funktion preexec, die dafür verwendet werden kann. Wird ein Wert ungleich Null zurückgegeben, wird der Befehl nicht im Verlauf gespeichert.
Keith
1
Damit zsh eine Reihe grundlegender gemeinsamer Befehle ignoriert, habe ich sie alle so ausgerichtet, dass vor ihnen ein Leerzeichen steht ... für c (ls fg bg jobs exit clear reset); do alias $ c = "$ c"; erledigt
Will Norris
4
Für faule zukünftige Leser wie mich, die noch nicht wissen, wie es geht: setopt HIST_IGNORE_SPACEin~/.zshrc
Al.G.
25

Wenn Sie den Befehl immer wieder ausführen, möchten Sie möglicherweise die Funktion zum Ignorieren des Shell-Verlaufs verwenden. Nehmen wir an, Sie haben secret.server.com, zu dem Sie sshen, FTP-Dateien usw., und Sie möchten keine Zeile, in der secret.server.com gespeichert ist:

In bashdu würdest setzen

HISTIGNORE="*secret.server.com*"

wohingegen in zshdem Parameter aufgerufen wird

HISTORY_IGNORE="*secret.server.com*"

Sie können mehrere Muster mit einem Doppelpunkt auflisten. Beachten Sie, dass jedes Muster mit der gesamten Eingabezeile abgeglichen wird , sodass Sie möglicherweise ein * einfügen müssen. Beispiel: Folgendes wird fortuneaus dem Verlauf ausgeschlossen, jedoch gespeichert fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Wenn HISTIGNORE eingestellt ist, wird nichts, was mit den aufgelisteten Mustern übereinstimmt, in .bash_history/ gespeichert, .zsh_historyund selbst die Aufwärtspfeiltaste, die normalerweise an Ihren vorherigen Befehl erinnert, funktioniert nicht, wenn sie mit Ihrem Muster übereinstimmt.

Mark McKinstry
quelle
3
Gibt es eine Chance, dass dies in zsh funktioniert?
Xenoterracide
Gibt es eine Option, um nur Zeilen zu ignorieren, die mit Glück beginnen? Etwas HISTIGNORE="^fortune*"zu ignorieren, fortune -laber zu behalten myfortune?
Bernhard
@xenoterracide Tut es, aber der Parameter hat einen anderen Namen. Ich habe es gerade in die Antwort bearbeitet.
27.
23

Verwenden Sie in der Bash die HISTCONTROLVariable.

Stellen Sie es auf HISTCONTROL=ignorespace(oder HISTCONTROL=ignoreboth). Wenn Sie eine Zeile mit einem Leerzeichen beginnen , wird sie ab sofort nicht mehr im Verlauf gespeichert. Dadurch wird vermieden, dass der nicht offenbarte Befehl in einer Konfigurationsdatei enthalten ist.

Auch so kommt es vor, dass man vergisst, das Leerzeichen einzufügen und dann zurück will. Um einen Eintrag im Verlauf zu löschen, verwenden Sie history -d <index>, mit indexder mit dem historyBefehl gefundenen Nummer (erste Spalte).

Shellholic
quelle
1
Funktioniert das in zsh?
Gert
11

Der einfachste Weg für ein Unikat ist

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

wo $stellt die Aufforderung des Anfangsschale und $$stellt die Eingabeaufforderung des Subshell. Dies funktioniert in bash und zsh; in ksh brauchst du HISTFILE=/notwritablestattdessen. Beachten Sie, dass es darauf ankommt, HISTFILEwann die Verlaufsdatei geschrieben wird und nicht wann der Befehl ausgeführt wird. Bash, ksh und zsh schreiben beim Beenden in die Verlaufsdatei (zsh kann dies je nach Konfiguration häufiger tun).

Alternativ können Sie mit bash oder zsh Zeilen ignorieren, die bestimmten Mustern entsprechen (dies wird bereits von anderen Antworten abgedeckt).

Eine andere Möglichkeit in zsh ist

% fc -p
% secret-command
% fc -P

fc -pVerschiebt die aktuelle Verlaufsliste auf einen Stapel und startet eine neue, die keiner Sicherungsdatei zugeordnet ist. fc -PKnallt die nicht gespeicherte Historie vom Stapel und vergisst sie insgesamt.

Während ein Prozess ausgeführt wird, werden der Befehl und seine Argumente (und auf einigen Systemen auch seine Umgebung) in der Prozesstabelle ( psAusgabe) angezeigt. Root kann frühere Befehle in der Systemabrechnungsdatenbank anzeigen und ohne Ihre Kontrolle mehr protokollieren. Und es wird wahrscheinlich alle Arten von forensischen Beweisen geben, die ungefähr zeigen, welchen Befehl Sie ausgeführt haben (wie z. B. Änderungszeiten von Dateien). Sie erhalten also keine Privatsphäre gegenüber entschlossenen Lauschern.

Gilles 'SO - hör auf böse zu sein'
quelle