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?

Jan Vorcak
quelle
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

u-punkt
quelle
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!)

Miquel
quelle
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
36
echo "discreet";history -d $(history 1)
John Doe
quelle
4
Ooh, Befehlskontrolle? Nett.
Kyle Strand
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

Rangaraj KS
quelle
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

Basile Starynkevitch
quelle
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.

Christian
quelle
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!

drkvogel
quelle
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.

Cédric ROYER
quelle
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."'
Rotareti
quelle
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).

pgl
quelle
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
cnd
quelle
0

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

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

Igor Santos
quelle
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>
RAVI THEJA
quelle