El requisito es capturar el historial de la línea de comandos en un archivo con la fecha y hora específicas de los comandos, cuando se ejecutaron.
El siguiente script captura el historial con fecha y hora, pero también asigna la fecha y hora actuales para comandos más antiguos. También quiero extender el script para realizar una copia de seguridad incremental del archivo de salida del historial.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Comentarios
- No ' t use el historial de shell para esto. Use contabilidad o sudo (y log sudo comandos).
- Cómo usar contabilidad o sudo para la captura del historial en un archivo
- sudo se puede configurar para capturar su historial (e incluso la salida tty ) en un archivo (o mediante syslog). ¿Qué quieres decir con " contabilidad "?
- @SunLynx, consulta ¿Cómo puede registrar cada comando escrito?
Responder
No es exactamente lo que deseado, pero puede obtener bash
para agregar marcas de tiempo a cada línea en el historial automáticamente. Simplemente configure, para su ejemplo:
HISTTIMEFORMAT="%d%b%y%T "
El history
comando sin argumentos mostrará las entradas del historial de esta manera:
23Jul1515:48:14 ls -ld .
El history -w
siempre escribe el archivo de historial en el formato interno de:
#1437659315 ls -ld .
es decir en 2 líneas, la primera línea contiene el tiempo en segundos «desde la época» (es decir, 1 de enero de 1970) con un #
delante para que no se confunda con un comando.
Comentarios
- Quiero capturar el historial a diario, el script anterior funciona pero asigna la fecha actual a todos los comandos. Además, después de cada comando se genera un número, que no ' quiero. Si alguien puede ayudar, será realmente útil.
- No sé a qué te refieres con " un número genera ". ¿Podría editar su pregunta original con un ejemplo de los archivos que desea obtener y su contenido?
- 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Jul15 00: 00: 01 # 1435988263 602 05Jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05Jul15 00: 00: 01 # 1435988281 604 05Jul15 00: 00: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
- Como este mensaje genera
- es difícil leer esto en un comentario. elimine sus comentarios y edite la pregunta que escribió originalmente, por favor.
Responda
En bash, hay una opción que le indica a bash que registre una marca de tiempo con cada comando. Para ello, asigne un valor útil a la variable de entorno HISTTIMEFORMAT
. Desde la bash
página de manual:
Si esta variable está establecida y no es nula, su valor se usa como cadena de formato para
strftime(3)
para imprimir la marca de tiempo asociada con cada entrada del historial mostrada por el historial incorporado. Si se establece esta variable, las marcas de tiempo se escriben en el archivo histórico para que puedan conservarse en las sesiones de shell. Esto usa el carácter de comentario del historial para distinguir las marcas de tiempo de otras líneas del historial.
En mi entorno, uso
HISTTIMEFORMAT="%s (%H:%M:%S):"
Para que los comandos puedan ordenarse fácilmente (%s
es una marca de tiempo en segundos) y legibles por humanos. En mi shell, cuando escribo history
, veo algo como lo siguiente:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: Pregunta de OP no completamente respondido.
También quiero extender el script para realizar una copia de seguridad incremental del archivo de salida del historial
No estoy seguro de lo que quiere decir con «copia de seguridad incremental» del archivo de historial. Quizás simplemente desee hacer una copia de seguridad del historial periódicamente. Hay un par de enfoques que puede tomar:
- Configure la variable PROMPT_COMMAND con
history -a
para actualizar continuamente el comando del historial después de cada invocación (en lugar de esperar a que se cierre la sesión). - Capture el DEBUG señal con una función que defina. Cada vez que se ingresa un comando, se llamará a la función. Desde dentro de la función puede hacer todo. (Un poco más confiable que PROMPT_COMMAND).
- cronjob para copiar / archivar periódicamente el archivo de historial.
Comentarios
- Gracias por las sugerencias, pero ' he probado anteriormente. ¿Podría explicarnos más sobre la historia? -A. El script de shell funciona bien, pero las marcas de tiempo son incorrectas.Este es un problema y otro es un número después de cada comando que comienza con #. por ejemplo # 1435987168.
- El
#1435987168
en el archivo de historial es la marca de tiempo . Hay un par de formas de convertir eso en un formato fácil de usar, que incluyen: cargar el archivo de historial en bash conhistory -n _filename_
y luegohistory
. O puede hacer algo como esto:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
para mostrar el historial con las marcas de tiempo. Entonces, ' s probablemente que las marcas de tiempo son correctas, pero tienes un problema de ubicación o zona horaria. - Desarrolla
history -a
?? La página de manual es un poco engañosa. Agrega el historial de la sesión actual al archivo designado por $ HISTFILE. Las llamadas posteriores agregarán el historial generado desde la última invocación (no ' t sobrescribe todo el archivo una y otra vez)