Como impedir que uma senha ou outras informações confidenciais sejam armazenadas no histórico do bash ao usar o grep?

21

Eu tive que grep recentemente por uma senha que pode ter sido salva em um arquivo. Eu não queria que essa linha aparecesse na história do bash.

Como impedir que uma senha ou outras informações confidenciais sejam armazenadas no histórico do bash ao usar o grep? Por exemplo, como posso o grep ler o padrão no stdin ou no console?

Leo
fonte

Respostas:

37

Se você colocar HISTCONTROL=ignorespaceseu .bashrc e colocar um espaço antes do nome do comando, ele não será adicionado ao seu histórico.

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

fonte
3
FWIW: A pergunta no título e a pergunta no corpo são completamente diferentes. Eu respondi a pergunta no título.
Sua crítica é apropriada. Acabei de editar o título. É melhor agora? Eu ainda acho (e parece que a comunidade) que sua resposta é a mais relevante.
267 Leo
1
Fiz uma edição da sua pergunta para esclarecer as coisas, disponibilizando as duas perguntas (impedindo que algo seja armazenado no histórico e lendo stdin com grep). Dessa forma, todas as respostas ainda são válidas, mas as soluções muito diferentes não serão confusas.
5

Apenas para completar, respondo à pergunta no corpo: como fazer com que o grep leia os padrões do stdin:

Você pode usar a -fopção:

grep -f- /path/to/file

Isso lerá qualquer número de padrões stdin, um por linha. ( -significa stdin; você também pode especificar um arquivo com padrões, um por linha.) grepcorresponderá a linhas nas /path/to/filequais correspondam a qualquer um dos padrões especificados.

rici
fonte
Obrigado por isso. Essa é uma contribuição bem e um truque útil para usar em outros lugares também, dizer quando um padrão or'ed é necessária
Leo
2

Este é o melhor que eu poderia ter:

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

Isso é seguro o suficiente? Existe alguma maneira de recuperar o padrão que não seja a rolagem do terminal? Existe uma maneira melhor?

Leo
fonte
3
Você pode usar read -spara impedir o eco (consulte também esta pergunta ). O segredo será visível na pssaída. Você pode usar grep -f /dev/stdin *(ou grep -f - *) para que o grep leia os padrões de um arquivo, ^D(read -es; echo $REPLY) | grep -f - *
finalize a
1
O shell de captura deve ter aspas duplas em torno dele. No momento, isso será interrompido se o usuário inserir espaços ou alguns caracteres especiais.