En Linux, se pueden recuperar comandos tipeados con anterioridad haciendo uso por ejemplo de las flechas de cursor hacia arriba y hacia abajo o si tu /etc/inputrc contiene:
"\e[5~": history-search-backward "\e[6~": history-search-backward
Tipeando parte del comando y presionando Page-Up o Page-Down para ir recuperando todos los comandos que tipeaste en otras oportunidades que coincidan con lo que llevás escrito hasta el momento.
Por ejemplo, para recuperar todos los comandos tipeados que comiencen con “nano”, bastaría escribir “nano” y usar Page Up y Down para ir conmutando en el historial entre todos los comandos que coincidan con el criterio de búsqueda. (Y de paso, anidé un tip dentro de otro tip).
Olvidémonos de que a veces uno anda haciendo chanchadas y vayamos al ejemplo mas típico: Necesitás tipear un comando que contiene información sensible, el nombre de un archivo, un nombre de dominio o una contraseña que preferirías mantener en secreto.
Necesitás tipear un comando que no quede registrado en el historial de comandos para que no lo lea alguien mas.
Este alguien mas podría ser un compañero de trabajo, otro proveedor o programador que usa tu mismo login o tiene la contraseña o key de root o para los mas paranoicos, un hacker que comprometió el sistema.
¿Como hacer para ejecutar el comando sin dejar rastros/registros?
La clave de todo el asunto está en el comando history y en la variable de entorno HISTCMD.
Bash así como otros tantos intérpretes de comandos lleva un registro de cada comando tipeado en el archivo ~/.bash_history –podés editarlo con tu $EDITOR y comprobar-. Desde este archivo es que mas tarde va recuperando los comandos que tipeamos a medida que los vamos necesitando.
¿Cuantos comandos lleva registrados en el historial tu intérprete de comandos? Fácil:
# echo $HISTCMD 507
507 va a ser el próximo comando a tipear por lo tanto el registro ya lleva 506 entradas en total.
¿Como tipear el próximo comando sin dejar rastros?
(Ninja Mode On):
Si tienen ganas de ahondar, vayan al manual del comando history, que controla todos los aspectos del historial, si no tienen ganas se los resumo:
El comando history por si solo muestra cada entrada en el historial precedida por un ordinal. Por ejemplo para ver las últimas tres entradas en el historial:
# history | tail -n3 506 echo $HISTCMD 507 history 508 history | tail -n3
Con lo que el próximo comando a tipear va a ser el 509 e inmediatamente a continuación de ese, el 510, etc.
Si quisiera borrar únicamente el comando número 506, la orden (que también quedará registrada en el historial) es la siguiente:
# history –d 506
Ahora, si quiero que mi próxima línea a tipear no quede registrada en el historial, necesito meter todo junto, el comando a ejecutar y la orden de eliminar la última línea tipeada, en una sola línea:
# history -d $((HISTCMD-1)) && comando_a_ejecutar
¿Se entendió?
Claro que también podrías haber usado history -c para deshacerte de todo el historial directamente pero eso no tiene nada de Ninja, mas bien es como venir con una bomba atómica y hacerla explotar.
O podes comenzar el comando con un espacio y no queda registrado. Si usas una distro DIY, pone
HISTCONTROL=ignoreboth
en tu .bashrc . De paso ignora los duplicados.
http://wiki.bash-hackers.org/syntax/shellvars
No, tu solución no sirve, ni la de hecky mas abajo tampoco. Es muy distro-dependiente, la probé en todos mis linux y no funciona en ninguno por no tener ignoreboth de serie.
Explicame como harías si te acaban de dar el key de acceso a un server, querés meter un comando en modo stealth pero no querés que el sysadmin se entere. Suponinendo que sea yo el que te acabo de dar un key y ninguno de mis servers tiene ignoreboth preseteado. Suponiendo además que controlo el historial y el contenido de los archivos de configuración de bash (que de hecho lo hago cada tanto).
Mi solución funciona toda las veces en todos los linux, limpiamente y sin dejar rastros ni tener que configurar nada.
No es mas facil escribir un espacio y luego el comando? Es rápida y útil. aunque no es muy Ninja xD
$ echo «No aparezco en el historia»
Notar el espacio entre $ y echo…
Saludos 😉
Me encantan tus posts!!! me haces reir mucho!
Hola, muchas gracias por tu articulo, me funciono.
Tengo una duda, como ejecuto este instruccion en un interprete de comando csh?
history -d $((HISTCMD-1)) && comando_a_ejecutar