Wie kann bei Verwendung von grep verhindert werden, dass ein Kennwort oder andere vertrauliche Informationen im Bash-Verlauf gespeichert werden?

21

Ich musste kürzlich nach einem Passwort suchen, das möglicherweise in einer Datei gespeichert wurde. Ich wollte nicht, dass diese Zeile in der Bash-Geschichte auftaucht.

Wie kann ich verhindern, dass bei Verwendung von grep ein Passwort oder andere vertrauliche Informationen im Bash-Verlauf gespeichert werden? Wie kann ich zum Beispiel grep dazu bringen, das Muster von stdin oder console zu lesen?

Löwe
quelle

Antworten:

37

Wenn Sie HISTCONTROL=ignorespaceIhre .bashrc-Datei eingeben und ein Leerzeichen vor dem Befehlsnamen einfügen, wird dies nicht zu Ihrem Verlauf hinzugefügt.

$ export HISTCONTROL=ignorespace
$ grep "passwd" secret_password_file.txt   # added to history
$  grep "passwd" secret_password_file.txt  # not added to history

quelle
3
FWIW: Die Frage im Titel und die Frage im Körper sind völlig unterschiedlich. Ich habe die Frage im Titel beantwortet.
Ihre Kritik ist angebracht. Ich habe gerade den Titel bearbeitet. Ist es jetzt besser? Ich denke immer noch (und so scheint es auch in der Community), dass Ihre Antwort am relevantesten ist.
Leo
1
Ich habe Ihre Frage bearbeitet, um die Dinge zu klären, und beide Fragen (die verhindern, dass etwas im Verlauf gespeichert wird und mit grep aus stdin gelesen wird) verfügbar gemacht. Auf diese Weise sind alle Antworten noch gültig, aber die sehr unterschiedlichen Lösungen werden nicht verwirrend sein.
5

Der Vollständigkeit halber beantworte ich die Frage im Körper: Wie bekomme ich grep, um Muster von stdin zu lesen:

Sie können die -fOption verwenden:

grep -f- /path/to/file

Das liest eine beliebige Anzahl von Mustern aus stdin, eines pro Zeile. ( -bedeutet stdin, Sie können auch eine Datei mit Mustern angeben, eines pro Zeile.) grepStimmt mit Zeilen überein, in /path/to/filedenen eines der angegebenen Muster übereinstimmt.

rici
quelle
Dank dafür. Dies ist ein guter Beitrag und ein praktischer Trick, den Sie auch an anderer Stelle anwenden können, beispielsweise wenn ein or'ed-Muster benötigt wird
Leo,
2

Dies ist das Beste, was ich mir einfallen lassen konnte:

grep $(read -p "Pattern: "; echo $REPLY) .*

Ist das sicher genug? Gibt es eine andere Möglichkeit, das Muster wiederherzustellen, als das Terminal zu scrollen? Gibt es einen schöneren Weg?

Löwe
quelle
3
Sie können verwenden read -s, um Echo zu verhindern (siehe auch diese Frage ). Das Geheimnis wird jedoch in der psAusgabe sichtbar sein . Sie können stattdessen grep -f /dev/stdin *(oder grep -f - *) verwenden, damit grep die Muster aus einer Datei ^D(read -es; echo $REPLY) | grep -f - *
liest. Beenden Sie die
1
Die Capture-Shell sollte in doppelte Anführungszeichen gesetzt sein. Im Moment wird dies unterbrochen, wenn der Benutzer Leerzeichen oder einige Sonderzeichen eingibt.