Pregunta Accidentalmente ingresé la contraseña en la línea de comandos de bash


Accidentalmente escribí mi contraseña en la línea de comando bash, confundiendo el Last login: ... línea para Wrong password (Estaba en un apuro). ¿Qué debo hacer para cubrir mi rastro?

Lo que hice fue editar .bash_history y eliminar la línea ofensiva (tuve que volver a iniciar sesión una vez para ver la contraseña aparecer en el archivo para poder eliminarla, y volver a iniciar sesión para ver que desaparezca del historial disponible con la tecla ARRIBA).

¿Hay algún otro lugar donde se pueda guardar el historial de comandos? El sistema es CentOS 6.5.


179


origen


Solo cambia la contraseña :) - gronostaj
Cambiar la contraseña no es tan simple ... Tendría que pedirle al administrador que reinstale mi nueva clave pública en 15 servidores diferentes, y el tipo es como /dev/null. - MaDa
Si no puede cambiar su contraseña fácilmente en cualquier momento, entonces puede tener una grave laguna de seguridad. ¿Qué harás cuando alguien realmente obtenga tu contraseña? ¿Tiene algún medio para revocar de inmediato el acceso al sistema? - gronostaj
Puede cambiar la contraseña de una clave ssh sin cambiar la clave: ssh-keygen -f id_rsa -p. - jwg
Acabo de mencionar que, al menos en los inicios de sesión de Windows conectados a la red, estás contaminado. La configuración predeterminada del administrador (en algunas torres de servidores elevados) es registrar todos los intentos de inicio de sesión, y por supuesto los nombres de usuario son claros. Todo lo que una persona emprendedora tiene que hacer es buscar cadenas que no sean de nombre de usuario y correlacionarlas con el siguiente nombre de usuario válido (o el siguiente intento de inicio de sesión en la misma máquina). Y no hay una manera simple de eliminar ese archivo de registro de administrador. Entonces realmente tienes que cambiar tu contraseña. - Carl Witthoft


Respuestas:


Puede eliminar solo la línea ofensiva de bashen lugar de borrar toda la historia. Simplemente elimina la línea con el -d marcar, luego guardar (escribir) la nueva historia con el -w bandera:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w

174



Tenga en cuenta que esto no funciona si ha configurado "PROMPT_COMMAND = history -a". Con esto en su lugar, el comando con su contraseña se escribe inmediatamente en su .bash_history cuando aparece el mensaje luego de que el comando finaliza. Tendrás que editar tu .bash_history para eliminarlo. - benrifkah


Hay dos partes para esto:

  • bash almacena el historial en un archivo ~/.bash_history que es, por defecto, escrito al final de la sesión
  • el history eso se guarda en la memoria

Para estar seguro, debe borrarlo de la sesión:

history -c

y truncar el archivo de historial según sea necesario:

> ~/.bash_history

Si su sesión en la que escribió la contraseña aún está abierta, entonces otra forma de cubre tu rastro es establecer el HISTFILE variable al dispositivo nulo para que el historial no se escriba en ~/.bash_history cuando la sesión sale:

export HISTFILE=/dev/null

120



¡Oye, mira, es el administrador! - Raystafarian
Pun no previsto, lo siento :) No estaba mirando tu nick cuando estaba escribiendo mi comentario. - MaDa
Ser paranoico (y por alguna razón aún no cambiar su contraseña) no debería shred el archivo o sobrescribirlo muchas veces? - kojiro
@MaDa No hay problema. Incluso agregué otra forma en la respuesta para poner mi nick en la imagen. - devnull
Ajuste HISTFILE= es suficiente. De bash(1): Si no está configurado, el historial de comandos no se guarda cuando sale un shell. - Lekensteyn


Como bash (al menos todas las versiones históricas y actuales que conozco) no guarda automáticamente el historial hasta que salga, una estrategia generalmente aplicable cuando ha escrito un comando que desea asegurarse de que nunca se guarde es escribir inmediatamente:

kill -9 $$

Esto mata el caparazón con SIGKILL, que no se puede atrapar, por lo que el shell no tiene forma de guardar nada al salir.

La mayoría de los otros enfoques implican depuración después del hecho (es decir, después de que los datos ya han llegado al disco), que tiene muchas más posibilidades de error (falta una copia), especialmente si el sistema puede estar utilizando btrfs o similar.


23



+1, no solo más posibilidades de error, mayo incluso ser recuperable dependiendo de si / cuántos comandos se ejecutaron después - Cruncher
¿Falta la palabra "automáticamente"? Porque dotancohen ha mostrado una forma de guardar el historial sin salir del shell. - Ben Voigt
El shell se puede configurar para guardar el historial después de ejecutar cada comando, en lugar de al salir. - Kundor
+1 ¡Esto es exactamente lo que quería recomendar! Además rm ~/.bash_history~ para eliminar el archivo de copia de seguridad en el caso del OP cuando ya se ha guardado - Tomas
Tenga en cuenta que esto no funciona si ha configurado "PROMPT_COMMAND = history -a". Con esto en su lugar, el comando con su contraseña se escribe inmediatamente en su .bash_history cuando aparece el mensaje luego de que el comando finaliza. Tendrás que editar tu .bash_history para eliminarlo. - benrifkah


Después de haber tecleado accidentalmente algo que no deseaba guardado en el historial, puede escribir: unset HISTFILE

Bash no sabrá dónde almacenar el historial cuando se cierre la sesión, por lo que esto desactivará el registro de historial para toda la sesión.


11



Tenga en cuenta que esto no funciona si ha configurado "PROMPT_COMMAND = history -a". Con esto en su lugar, el comando con su contraseña se escribe inmediatamente en su .bash_history cuando aparece el mensaje luego de que el comando finaliza. Tendrás que editar tu .bash_history para eliminarlo. - benrifkah


Mi truco favorito para esto es presionar la flecha hacia arriba, retroceder sobre el comando, escribir algo (puede que no sea necesario), presionar la flecha hacia abajo, escribir "ls" y presionar enter. Se siente realmente molesto, pero en realidad funciona. Descubrí esto cuando me enojé después de editar el comando incorrecto en mi historial y luego lo arruiné al no presionar ctrl-c para abortar la edición. Creo que bash apoya la historia revisionista. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Parece:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 

10



Eso es extraño. Una desventaja es que parece que conoce su historia editada, por lo que podría haber alguna forma de restaurar la versión anterior. - MadTux
@MadTux - Totalmente, pero .bash_history es solo un archivo de texto sin formato. Entonces puede hacer el ejemplo anterior, salir y reconectarse. Cuando ve el contenido completo del archivo .bash_history, no hay nada allí que lo diferencie si acaba de ejecutar "cd", por lo que el camino está limpio. - Mark Jerde
Tenga en cuenta que esto no funciona si ha configurado "PROMPT_COMMAND = history -a". Con esto en su lugar, el comando con su contraseña se escribe inmediatamente en su .bash_history cuando aparece el mensaje luego de que el comando finaliza. Tendrás que editar tu .bash_history para eliminarlo. - benrifkah


Adicional a las otras respuestas, puede ser relevante que la contraseña también se encuentre en el búfer de desplazamiento del terminal - el historial del texto que se muestra - ahora, y, más que un problema, posiblemente en el disco duro, si el emulador de terminal guardó el historia en el disco. Esto sucede en la consola KDE, ya que el tamaño del historial está configurado en "desviación ilimitada", para no descartar ninguna salida.


10





Con $<space> command, un comando no se agrega a la historia, a veces útil

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep

5



Si bien es interesante, no está claro cómo esto es útil en el escenario descrito. ¿Estás sugiriendo que cada contraseña debería comenzar con un espacio? - Ben Voigt
No, lo que está sugiriendo es que con esto en su lugar, cualquier línea que escriba que no quiera comprometerse con el historial, debe escribirse con un espacio líder. por ejemplo: "ls" se convierte en "ls" y esa línea nunca aparece en el historial ni en la lista de flechas de las sesiones. - Bryan C.
Tenga en cuenta que este truco del espacio inicial solo funciona si $ HISTCONTROL contiene espacio ignorado. - Bernd Jendrissek
@ jris198944 Proporcionar una contraseña a través de un argumento de línea de comando podría potencialmente exponerlo a cualquiera en el sistema que ejecuta ps. - jamesdlin
Y de todos modos, aunque este truco es útil si estás planeando el futuro, esto no ayuda al escenario original en el que alguien accidentalmente ingresó una contraseña en una línea de comando. - jamesdlin


Otra alternativa para evitar guardar en el archivo de historial (antes de cerrar la sesión) es simplemente chmod 444 ~ / .bash_history y luego cerrar la sesión. Ingresa nuevamente y restablece los permisos (o no, ¡dependiendo de cuán paranoico seas!).


4





Veo repetidamente mencionado

Tenga en cuenta que esto no funciona si ha configurado "PROMPT_COMMAND = history -a" [..]. Deberá editar su .bash_history para eliminarlo.

La primera parte es definitivamente cierta, pero no tiene que recurrir a la edición manual de .bash_history para solucionarlo. Si combina los dos comandos en una línea, funciona perfectamente bien:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w

1



¿Podría explicar qué hace exactamente que este método funcione? - Kamil Maciorowski
PROMPT_COMMAND solo se ejecuta antes de mostrar el siguiente símbolo del sistema. El problema al ingresar los comandos -d y -w en líneas separadas es que PROMPT_COMMAND ejecutará el comando history -a en el medio. Si ejecuta tanto el -d como el -w en una línea de comando, solo se ejecuta luego - Floris Kruisselbrink