domingo, 25 de marzo de 2012

Historial de historiales de líneas de comando en el Bash

En Unix (Linux,*BSD, etc), sobre todo si eres un administrador de sistemas, y estas constantemente ejecutando líneas de comando en una terminal, ya sea localmente o con una conexión ssh, recordar todas las líneas de comando que ejecutaste alguna vez en tu vida, puede ahorrarte mucho tiempo y muchas leídas del man.
El BASH es uno de los shell más comunes hoy en día, y tiene su funcionalidad propia para recordar una cantidad de líneas ejecutadas, o una cantidad de KB de tamaño, para el archivo de historial.
Este por lo general se encuentra en

$HOME/.bash_history

Lo primero que había hecho, un tiempo atrás, fue aumentar la capacidad del historial, pero esto a la larga hacía que mi sesión de shell tardara más en ejecutarse, ya que el bash carga el historial en memoria, con lo cual es rápidamente accesible mediante el shorcut para el buscador: CLTR-R.
Esto me permitía buscar entre los comando recientemente ejecutados, todos aquellos que estaban en el history actual.
El problema se presentaba cuando este archivo llegaba a su máxima capacidad y se empezaba a peder el historial de los comandos más antiguos.
Fue entonces cuando decidí crear esta pareja de scripts, que guardan un historial de historiales.
Te recomiendo colocarlos en una ruta bajo tu path de ejecución. Yo lo tengo en  /usr/local/bin

-- inicio de  /usr/local/bin/backup-historial.sh --

#!/bin/bash
#
# Copia el historial y luego crea un archivo sin duplicados
# desde donde luego se puede consultar con el comando Buscar.sh
#
# Se recomienda colocar la ejecucion de este script al final del\
# $HOME/.bashrc y al final  del $HOME/.bash_logout de esa forma,
# se persisten la mayor cantidad de comandos
#
# Este es un shell script gratuito distribuido bajo la licencia
# GNU GPL version 3.0
# Copyright (C) 2012 Ale Feltes
#
# alefeltes \en\ gmail \punto\ com
#

#la fecha en formato AAAA-mm-dd
STAMP="`date +%F`"

#el directorio bajo el $HOME donde se guardan los historicos
DIR="$HOME/sysadmin/historicos-bash"
if [ ! -d $DIR ]; then
    mkdir -pv $DIR
fi

#copiamos el historial actual, con la fecha actual
cp -vf $HOME/.bash_history $DIR/history-${STAMP}
cd $DIR

#concatenamos todos los historiales, ordenamos y eliminamos
#duplicados
cat history-* | sort | uniq   > /tmp/history-global-$UID

#finalmente movemos al archivo unico con el $UID
mv -vf /tmp/history-global-$UID .

-- fin de  /usr/local/bin/backup-historial.sh --

Para el script que consulta los historiales, utilizo la primera letra en mayúscula, para facilitarme el autocompletado con el TAB

-- inicio de  /usr/local/bin/Buscar.sh --

#!/bin/bash
#
# Busca en el history del bash una cadena
#
# Este es un shell script gratuito distribuido bajo la licencia
# GNU GPL version 3.0
# Copyright (C) 2012 Ale Feltes
#
# alefeltes \en\ gmail \punto\ com
#

#buscamos en el historial actual y en el historial general guardado
#con el script /usr/local/bin/backup-historial.sh
cat $HOME/.bash_history $HOME/sysadmin/historicos-bash/history-global-$UID \
    | grep $1 | sort | uniq
-- fin de  /usr/local/bin/Buscar.sh --

Como se puede leer en el primer script, es recomendado que lo coloques en los archivos  

$HOME/.bashrc : para que se ejecute cada vez que abras un shell, y en el $HOME/.bash_logout : para que se ejecute y haga la copia del historial, cada cierre de sesión de un shell.


No hay comentarios: