¿Cómo evitar que una contraseña u otra información confidencial se almacene en el historial de bash cuando se usa grep?

21

Tuve que buscar recientemente una contraseña que podría haberse guardado en un archivo. No quería que esa línea apareciera en la historia de bash.

¿Cómo puedo evitar que una contraseña u otra información confidencial se almacene en el historial de bash cuando uso grep? Por ejemplo, ¿cómo puedo obtener grep para leer el patrón desde stdin o consola?

León
fuente

Respuestas:

37

Si coloca HISTCONTROL=ignorespacesu .bashrc y coloca un espacio antes del nombre del comando, no se agregará a su historial.

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

fuente
3
FWIW: La pregunta en el título y la pregunta en el cuerpo son completamente diferentes. Respondí la pregunta en el título.
Tu crítica es apropiada. Acabo de editar el título. ¿Esta mejor ahora? Todavía pienso (y así parece la comunidad) que su respuesta es la más relevante.
Leo
1
Hice una edición de su pregunta para aclarar las cosas, haciendo que ambas preguntas (que evitan que algo se almacene en el historial y la lectura de stdin con grep) estén disponibles. De esta manera, todas las respuestas siguen siendo válidas, pero las soluciones muy diferentes no serán confusas.
5

Solo para completar, respondo la pregunta en el cuerpo: cómo obtener grep para leer patrones de stdin:

Puedes usar la -fopción:

grep -f- /path/to/file

Eso leerá cualquier número de patrones stdin, uno por línea. ( -significa stdin; también puede especificar un archivo con patrones, uno por línea). grepCoincidirá con las líneas /path/to/fileque coincidan con cualquiera de los patrones especificados.

rici
fuente
Gracias por eso. Esa es una buena contribución y un truco útil para usar también en otros lugares, por ejemplo, cuando se necesita un patrón ordenado
Leo
2

Esto es lo mejor que se me ocurrió:

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

¿Es esto lo suficientemente seguro? ¿Hay alguna forma de recuperar el patrón que no sea desplazar el terminal? ¿Hay una mejor manera?

León
fuente
3
Puede usar read -spara evitar el eco (consulte también esta pregunta ). Sin psembargo, el secreto será visible en la salida. En su lugar, puede usar grep -f /dev/stdin *(o grep -f - *) para que grep lea los patrones de un archivo, termine la entrada con ^D, o:(read -es; echo $REPLY) | grep -f - *
mr.spuratic
1
El shell de captura debe tener comillas dobles a su alrededor. Por el momento, esto se romperá si el usuario ingresa espacios o algunos caracteres especiales.