2011-08-25 20 views
5

Me preguntaba, por curiosidad, si es posible codificar un script bash, registra todo el comando ejecutado en una sesión Bash/SSH. Sé que history se supone que debe registrar todos los comandos ejecutados, pero parece ser muy poco confiable.Bash Command Logger

He estado jugando esta mañana y se me ocurrió el siguiente script bash que registra lo que el usuario ejecuta en el terminal pero no ejecuta todos los comandos correctamente.

prompt_read() { 
    echo -n “$(whoami)@$(hostname):$(pwd)~$ “ 
    read userinput 
} 

prompt_read 

while :; do 
    if [[ $userinput != exit ]]; then 
    logger "logit $userinput" 
    bash -c "$userinput" 
    prompt_read 
    else 
    kill -1 $PPID 
    fi 
done 

Hay alguien al tanto de todo lo que registra los comandos mejor y más fiable que history

Saludos

Respuesta

8

La razón por la cual la historia parece poco fiable a que se debe a que sólo escribe la historia al final de una Sesión de BASH, por lo que podría perder comandos.

tengo unas pocas cosas en mi perfil bash:

HISTFILESIZE=10000 # how many lines of history to store in the history file 

HISTSIZE=10000 # how many lines of history to store in a session (I think) 

HISTCONTROL=ignoredups # ignore duplicate commands 

shopt -s histappend # append history, rather than having sessions obliterate existing history 
PROMPT_COMMAND="history -a;$PROMPT_COMMAND" 

los últimos son los más importantes, el establecimiento de su PROMPT_COMMAND con history -a hará historia anexar inmediatamente, en lugar de después de la sesión. Y establecer shopt -s histappend hará que las sesiones de bash se agreguen al archivo de historial, en lugar de sobrescribir historias existentes.

algo más de información: http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

Además, si esto es útil para usted, usted puede cambiar el nombre del archivo de historial se utiliza para una sesión de bash en particular con la variable HISTFILE medio ambiente.

+1

+1, btw, También es posible establecer 'HISTFILE' para, digamos, tener archivos de historial de fecha. – Hasturkun

+0

@Hasturkun - gracias por mencionar eso. – birryree

4

Salida guión: http://bashshell.net/commands/using-the-script-command/

Se registra todo lo que aparece en el terminal en un archivo, y IIRC se puede reproducir la sesión grabada.

Puede configurar esto como el shell del usuario para que grabe todo al iniciar sesión.

+0

Para reproducirlo necesita ['scriptreplay'] (http://manpages.ubuntu.com/manpages/intrepid/man1/scriptreplay.1.html). – birryree

2

Puede encontrar un script here para registrar todos los comandos/instrucciones internas 'bash' en un servidor de archivos de texto o 'syslog' sin utilizar un parche o una herramienta ejecutable especial.

También puede escribir directamente sin syslog en un archivo de registro.

Es muy fácil de implementar, ya que es un simple script de shell que necesita ser llamado una vez en la inicialización del 'bash'.