Jak zapobiec przechowywaniu hasła lub innych poufnych informacji w historii bash podczas korzystania z grep?

21

Ostatnio musiałem grepować za hasłem, które mogło zostać zapisane w pliku. Nie chciałem, aby ten wiersz pojawiał się w historii bash.

Jak mogę zapobiec przechowywaniu hasła lub innych poufnych informacji w historii bash podczas korzystania z grep? Na przykład, jak mogę uzyskać grep, aby odczytał wzór ze standardowego wejścia lub konsoli?

Lew
źródło

Odpowiedzi:

37

Jeśli wstawisz HISTCONTROL=ignorespace.bashrc i umieścisz spację przed nazwą polecenia, nie zostanie ona dodana do twojej historii.

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

źródło
3
FWIW: Pytanie w tytule i pytanie w ciele są zupełnie inne. Odpowiedziałem na pytanie w tytule.
Twoja krytyka jest słuszna. Właśnie zredagowałem tytuł. Czy teraz jest lepiej? Nadal uważam (i wydaje się, że społeczność), że twoja odpowiedź jest najbardziej istotna.
Leo
1
Zmodyfikowałem twoje pytanie, aby wyjaśnić różne rzeczy, udostępniając oba pytania (zapobiegając przechowywaniu czegoś w historii i czytając standardowe wejście z grep). W ten sposób wszystkie odpowiedzi są nadal aktualne, ale bardzo różne rozwiązania nie będą mylące.
5

Dla kompletności odpowiadam na pytanie w ciele: jak zmusić grepa do odczytania wzorców ze standardowego wejścia:

Możesz użyć -fopcji:

grep -f- /path/to/file

Odczyta dowolną liczbę wzorów stdin, po jednym w wierszu. ( -oznacza stdin; możesz także określić plik ze wzorami, po jednym w wierszu.) grepdopasuje linie, w /path/to/filektórych pasuje dowolny z określonych wzorców.

rici
źródło
Dziękuję za to. Jest to dobry wkład i przydatna sztuczka, której można także użyć w innym miejscu, powiedz, kiedy potrzebny jest wzór or'ed
Leo
2

To najlepsze, co mogłem wymyślić:

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

Czy to jest wystarczająco bezpieczne? Czy istnieje sposób na odzyskanie wzorca innego niż przewijanie terminala? Czy jest lepszy sposób?

Lew
źródło
3
Możesz użyć, read -saby zapobiec echu (zobacz także to pytanie ). Sekret będzie widoczny na pswyjściu. Można użyć zamiast grep -f /dev/stdin *(lub grep -f - *), aby grep odczyta wzór (ów) z pliku zamiast wejście końcowemu ^D, czyli(read -es; echo $REPLY) | grep -f - *
mr.spuratic
1
Powłoka przechwytująca powinna mieć wokół siebie podwójne cudzysłowy. W tej chwili przestanie to działać, jeśli użytkownik wprowadzi spacje lub niektóre znaki specjalne.