Escribí accidentalmente la contraseña en la línea de comando bash

189

Accidentalmente escribí mi contraseña en la línea de comando bash, confundiendo la Last login: ...línea con Wrong password(tenía prisa). ¿Qué hago para cubrir mi rastro?

Lo que hice fue editar .bash_historyy 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 nuevamente para verla desaparecer del historial disponible en la tecla FLECHA ARRIBA).

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

MaDa
fuente
59
Simplemente cambie la contraseña :)
gronostaj 02 de
96
Cambiar la contraseña no es tan simple ... Necesito pedirle al administrador que reinstale mi nueva clave pública en 15 servidores diferentes, y el tipo es como /dev/null.
MaDa
71
Si no puede cambiar su contraseña fácilmente en cualquier momento, puede tener una laguna de seguridad grave. ¿Qué harás cuando alguien obtenga tu contraseña? ¿Tiene algún medio para revocar de inmediato el acceso al sistema?
gronostaj
42
Puede cambiar la contraseña de una clave SSH sin cambiar la clave: ssh-keygen -f id_rsa -p.
jwg
66
Solo voy a mencionar que, al menos bajo los inicios de sesión de Windows en red, estás manguera. El valor predeterminado predeterminado para el 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 texto sin formato. 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 próximo 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. Así que realmente tienes que cambiar tu contraseña.
Carl Witthoft

Respuestas:

184

Puede eliminar solo la línea ofensiva del bashhistorial de, en lugar de borrar todo el historial. Simplemente elimine la línea con la -dbandera, luego guarde (escriba) el nuevo historial con la -wbandera:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
fuente
1
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 se muestra el mensaje una vez que finaliza el comando. Tendrás que editar tu .bash_history para eliminarlo.
benrifkah
1
También tenga en cuenta que si la línea se escribió en el archivo de host y luego se abrieron varios shells (ventanas de terminal), ¡TODOS esos shells lo tendrán en su historial! Deberá eliminarlo de todos esos depósitos, O al menos del último ÚLTIMO historial que cierre. Es mejor obtenerlo antes de que exista el shell que lo usó. La historia cuando se trata de múltiples proyectiles puede convertirse en una pesadilla.
Anthony el
121

Hay dos partes para esto:

  • bashalmacena el historial en un archivo ~/.bash_historyque, por defecto, se escribe al final de la sesión
  • el historyque 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 cubrir su rastreo es establecer la HISTFILEvariable en el dispositivo nulo para que no se escriba el historial ~/.bash_historycuando salga la sesión:

export HISTFILE=/dev/null
devnull
fuente
205
Hola mira, es el administrador!
Raystafarian
55
Juego de palabras no intencionado, lo siento :) No estaba mirando tu nick cuando estaba escribiendo mi comentario.
MaDa
77
Para ser paranoico (y, sin embargo, por alguna razón aún no cambiar su contraseña) ¿no debería usted shredel archivo o sobreescribirlo muchas veces?
kojiro
1
@MaDa No hay problema. Incluso agregué otra forma en la respuesta para poner mi nick en la imagen.
devnull
55
El ajuste HISTFILE=es suficiente. De bash(1): si no está configurado, el historial de comandos no se guarda cuando sale un shell.
Lekensteyn
23

Dado que 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 de inmediato:

kill -9 $$

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

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

R ..
fuente
2
+1, no solo más posibilidades de error, incluso puede ser recuperable dependiendo de si / cuántos comandos se ejecutaron después de él
Cruncher
¿Falta la palabra "automáticamente"? Porque dotancohen ha mostrado una forma de guardar el historial sin salir del shell.
Ben Voigt
3
El shell se puede configurar para guardar el historial después de ejecutar cada comando, en lugar de al salir.
Nick Matteo
1
+1 ¡Esto es exactamente lo que quería recomendar! Además rm ~/.bash_history~de eliminar el archivo de copia de seguridad en el caso del OP cuando ya se ha guardado
Tomás
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 se muestra el mensaje una vez que finaliza el comando. Tendrás que editar tu .bash_history para eliminarlo.
benrifkah
11

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

Bash no sabrá dónde almacenar el historial cuando cierre la sesión, por lo que efectivamente deshabilitará el registro del historial para toda la sesión.

mtak
fuente
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 se muestra el mensaje una vez que finaliza el comando. Tendrás que editar tu .bash_history para eliminarlo.
benrifkah
11

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 tonto, pero en realidad funciona. Descubrí esto cuando me molesté después de editar el comando incorrecto en mi historial y luego arruinarlo al no presionar ctrl-c para abortar la edición. Supongo que bash es compatible con 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
$ 
Mark Jerde
fuente
Eso es raro . Una desventaja es que parece saber que has editado el historial, 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 volver a conectar. Cuando ve el contenido completo del archivo .bash_history, no hay nada que lo diferencie de 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 se muestra el mensaje una vez que finaliza el comando. Tendrás que editar tu .bash_history para eliminarlo.
benrifkah
10

Además de 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, lo que es más problemático, posiblemente en el disco duro, si el emulador de terminal guardó el historia al disco. Esto sucede en KDE konsole si el tamaño del historial está configurado en "desplazamiento ilimitado", para nunca descartar ningún resultado.

Volker Siegel
fuente
6

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

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
fuente
2
Si bien es interesante, no está claro cómo esto es útil en el escenario descrito. ¿Estás sugiriendo que cada contraseña debe comenzar con un espacio?
Ben Voigt
1
No, lo que está sugiriendo es que con esto en su lugar, cualquier línea que escriba que no desee que se comprometa con la historia, debe escribirse con un espacio inicial. por ejemplo: "ls" se convierte en "ls" y esa línea nunca se muestra en el historial o en la lista de flecha hacia arriba de sus sesiones.
Bryan C.
44
Tenga en cuenta que este truco de espacio inicial funciona solo si $ HISTCONTROL contiene ignorespace.
Bernd Jendrissek
2
@ jris198944 Proporcionar una contraseña a través de un argumento de línea de comandos podría exponerla a cualquiera en el sistema que se ejecute ps.
jamesdlin
2
Y de todos modos, si bien este truco es útil si está planeando con anticipación, esto no ayuda al escenario original en el que alguien ingresó accidentalmente una contraseña en una línea de comandos.
jamesdlin
4

Otra alternativa más para evitar guardar en el archivo de historial (antes de cerrar sesión) es simplemente

chmod 400 ~/.bash_history 

y luego cerrar sesión. Deje de escribir el historial en el archivo (ya que el archivo es de solo lectura) para que se descarte toda la sesión bash y se conserve el historial anterior.

Inicie sesión nuevamente y restablezca los permisos a 600(o no, dependiendo de lo paranoico que sea).

Adán
fuente
1

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
Floris Kruisselbrink
fuente
¿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 de historial -a en el medio. Si ejecuta tanto la -d como la -w en una línea de comando, solo se ejecuta después
Floris Kruisselbrink
0

Muchas de las respuestas aquí intentan eliminar el comando en cuestión del historial de la sesión curh bash antes de que se escriba en $HISTFILE(~ / .bash_history por defecto). Sin embargo, si ha configurado PROMPT_COMMAND=history -a el comando con su contraseña, se escribe inmediatamente en su $HISTFILEcuando se muestra el mensaje una vez que finaliza el comando. Tendrás que editar tu $HISTFILEpara eliminarlo.

Esta configuración se usa comúnmente para intercalar comandos de múltiples sesiones de bash abiertas .

benrifkah
fuente
-3

También querrá verificar los registros de syslog. Los inicios de sesión no válidos generalmente se registrarán en syslog.

/ var / log / messages o el equivalente para su sistema operativo.

bcarroll
fuente
1
El problema no es que ingresó una contraseña incorrecta, ya inició sesión e ingresó su contraseña en el indicador y presionó enter. Esto no aparecerá en el archivo de mensajes.
MaQleod