Befehl ausführen, ohne ihn im Verlauf zu behalten [geschlossen]


203

Ich möchte einige Befehle ausführen, aber nicht im Befehlsverlauf speichern. Damit niemand in der Lage ist, es in der .bash_historyDatei zu suchen .

Gibt es eine Möglichkeit, Bash-Befehle auf diese Weise auszuführen?


13
Diese Frage sollte wahrscheinlich nach ServerFault verschoben werden, da dies nicht so sehr "programmiert" als "Serveradministrator" - aber danke für die Frage / Antwort, genau das, was ich brauchte!
Andrew Theken

Antworten:


294

Beginnen Sie Ihren Befehl mit einem Leerzeichen und es wird nicht in den Verlauf aufgenommen.

Beachten Sie, dass hierfür die Umgebungsvariable $HISTCONTROLfestgelegt werden muss.

  • Überprüfen Sie, ob der folgende Befehl ignorespaceoder zurückgibtignoreboth

    #> echo $HISTCONTROL
  • Um die Umgebungsvariable hinzuzufügen, falls sie fehlt, kann die folgende Zeile zum Bash-Profil hinzugefügt werden. Z.B%HOME/.bashrc

    export HISTCONTROL=ignorespace

Nach dem erneuten Sourcing des Profils werden keine Befehle mit Leerzeichenpräfix geschrieben $HISTFILE


20
Dies funktioniert nur, wenn in $ HISTCONTROL ein Ignorierraum enthalten ist - obwohl dies auf den meisten Systemen wahrscheinlich die Standardeinstellung ist.
pgl

2
Richtig. Für weitere Informationen sollte sich das OP HISTCONTROL und HISTIGNORE in der Bash-Manpage ansehen.
U-Punkt

2
thegeekstuff.com/2008/08/… - Weitere Tipps zum Bash-Verlauf finden Sie hier, einschließlich dieser Methode zum Ausblenden von Befehlen aus dem Verlauf
user379997

52

Setzen Sie in einer bestimmten Bash-Sitzung die Verlaufsdatei auf / dev / null, indem Sie Folgendes eingeben:

export HISTFILE=/dev/null

Beachten Sie, dass, wie in den Kommentaren erwähnt, keine Befehle in dieser Sitzung in den Verlauf geschrieben werden!

Leg dich bitte nicht mit der harten Arbeit deines Systemadministrators an;)

Doodads Lösung ist eleganter. Deaktivieren Sie einfach die Variable: unset HISTFILE(danke!)


5
Dadurch wird verhindert, dass alle Befehle protokolliert werden. Es ist nicht das, was der Fragesteller will.
Noufal Ibrahim

12
Dies verursachte Probleme für mich, da die /dev/nullBerechtigungen beim Abmelden auf 0600 festgelegt wurden. Stattdessen habe ich verwendet unset HISTFILE.
Doodad


21

Eine Erweiterung der Antwort von @John Doe & @ user3270492. Aber das scheint für mich zu funktionieren.

<your_secret_command>; history -d $((HISTCMD-1))

Sie sollten den Eintrag des Befehls nicht in Ihrem Verlauf sehen.

Hier ist die Erklärung ..

Das 'history -d' löscht den genannten Eintrag aus dem Verlauf.

Das HISTCMD speichert die Befehlsnummer der nächsten auszuführenden. (HISTCMD-1) bezieht sich also auf den zuletzt ausgeführten Befehl.

Entfernen Sie eine bestimmte Zeile aus der Bash-Verlaufsdatei


Leider hat das bei mir nicht funktioniert.
Magick

10

Sie könnten in Betracht ziehen, eine Shell ohne Verlauf zu verwenden, wie vielleicht

/bin/sh << END
   your commands without history
END

(vielleicht /bin/dashoder /bin/sashkönnte angemessener sein als /bin/sh)

oder noch besser das Batch- Dienstprogramm verwenden, z

batch << EOB
   your commands
EOB

Die Geschichte würde dann enthalten shoder batchwas nicht sehr aussagekräftig ist


8

Sie können Ihre Sitzung mit beginnen

export HISTFILE=/dev/null ;history -d $(history 1)

Fahren Sie dann mit Ihren hinterhältigen Aktivitäten fort. Das Festlegen der Histdatei auf /dev/nullwird in der Verlaufsdatei protokolliert. Dieser Eintrag wird jedoch sofort gelöscht und es werden keine Spuren (zumindest in der Verlaufsdatei) angezeigt.

Auch dies ist nicht permanent.


Dies wurde bereits viele Male beantwortet. Was würden Sie sagen, Ihre Antwort fügt diesem Thread hinzu (außer nutzlosem Rauschen)?
gniourf_gniourf

Es wurde nicht in einer Antwort zusammengefasst , damit der Befehl selbst nicht in der Historie angezeigt wird und nichts angezeigt wird, was danach eingegeben wird.
Christian

1
Aber jetzt ist dieser Thread ein echtes Chaos! In diesem Fall, besonders für eine so alte Frage,
halte

5

Wie von Doodad in den Kommentaren erwähnt , unset HISTFILEfunktioniert dies gut, aber falls Sie auch einen Verlauf löschen möchten, müssen Sie echo $HISTFILE(normalerweise ~/.bash_history) den Speicherort der Verlaufsdatei abrufenunset HISTFILE und bearbeiten ~/.bash_history(oder was auch immer HISTFILEwar - natürlich ist es jetzt unsetso, dass Sie es können. ' t lies es).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Dann haben Sie Ihren Verlauf bearbeitet und die Tatsache, dass Sie ihn bearbeitet haben!


Versuchte dies auf: GNU Bash, Version 3.2.57 (1) -Veröffentlichung (x86_64-apple-darwin15) und es funktioniert nicht. Die Befehle, die ich nach dem Deaktivieren von HISTORY verwendet habe, wurden in ~ / .bash_history
Krystian am

@Krystian Mein Fehler - Ich hatte "nicht gesetzte GESCHICHTE" geschrieben, wenn es "nicht gesetzte HISTFILE" sein sollte - korrigiert. Funktioniert es jetzt? Es funktioniert mit GNU Bash, Version 4.3.30 (1) -Veröffentlichung (x86_64-pc-linux-gnu).
Drkvogel

Nun, ich bin mir nicht sicher. Einfacher Test: unset HISTFILE; echo TEST; historyGibt Ihnen den Befehl echo TESTwie der vorletzte. Obwohl der Verlauf nach Beendigung der Sitzung und erneuter Verbindung in der Tat nicht über diesen Eintrag verfügt. Also würde ich sagen, es funktioniert :)
Krystian

unset HISTFILEscheint nicht zu verhindern, dass Befehle im Verlauf im Speicher aufgezeichnet werden, aber es verhindert, dass sie in einer beliebigen Datei $ HISTFILE aufgezeichnet werden. Ich denke, Sie haben Ihren lokalen Verlauf noch im Speicher, aber er wird nicht mehr in einer Datei aufgezeichnet, was Sie vielleicht wollen! ;)
drkvogel

4

Sie können auch den folgenden Befehl verwenden:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Ich denke, es ist ein sehr portabler Befehl.


Ich habe einen Alias ​​daraus erstellt: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"und jetzt können Sie es so etwas tun:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
Entschuldigung, aber mir ist klar, dass Sie eine Funktion anstelle eines Alias ​​erstellen müssen, da Anführungszeichen die Bedeutung $sund andere Dinge in sed ändern . function forget() { // put code here // }
sobi3ch

3

Wenn Sie zsh verwenden , können Sie Folgendes ausführen:

setopt histignorespace

Nachdem dies festgelegt wurde, wird jeder Befehl, der mit einem Leerzeichen beginnt , aus dem Verlauf ausgeschlossen.

Sie können mit Aliasnamen in .zshrcdiese einzuschalten on / off :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Schön, aber diese Frage ist speziell markiert Bash
Tripleee

2

Es gibt verschiedene Möglichkeiten, dies zu erreichen. Dadurch wird die Größe der Verlaufsdatei auf 0 gesetzt:

export HISTFILESIZE=0

Dadurch wird die Verlaufsdatei auf gesetzt /dev/nullund effektiv deaktiviert:

export HISTFILE=/dev/null

Bei einzelnen Befehlen können Sie dem Befehl ein Leerzeichen voranstellen, das nicht in der Verlaufsdatei gespeichert wird. Beachten Sie, dass hierfür der ignorespaceWert in der $HISTCONTROLUmgebungsvariablen enthalten sein muss (man bash und suchen Sie ignorespacenach weiteren Details).


2
Dadurch wird verhindert, dass alle Befehle protokolliert werden. Es ist nicht das, was der Fragesteller will.
Noufal Ibrahim

Nun, ich ging davon aus, dass der Fragesteller die Werte zurücksetzen würde, nachdem er getan hatte, was er wollte, das nicht protokolliert werden sollte.
pgl

1

Dies ist praktisch, wenn Sie den gesamten Verlauf löschen möchten, einschließlich der Tatsache, dass Sie den gesamten Verlauf gelöscht haben!

rm .bash_history;export HISTFILE=/dev/null;exit

0

Sie müssen nur ausführen:
$ set +o history

Um mehr zu sehen, führen Sie Folgendes aus:
$ man set


2
Dadurch wird der Verlauf für alle zukünftigen Befehle deaktiviert, nicht für einen einzelnen Befehl. Die meisten Leute, die hierher kommen, sollten sich stattdessen die akzeptierte Antwort ansehen.
Tripleee

Dies ist gültig oder in Ordnung, aber unvollständig. Solange wir set -x historydanach den umgekehrten Befehl hinzufügen , funktioniert es.
Abdillah

0

Dieser Befehl kann nützlich sein. Dadurch wird der ausgeführte Befehl nicht aufgezeichnet

history -d $((HISTCMD-1)) && <Your Command Here>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.