Escreva bash_history para um arquivo com timestamp

1

O requisito é capturar o histórico da linha de comando em um arquivo com data e hora específicas dos comandos, quando eles foram executados.

O script abaixo captura o histórico com data e hora, mas também atribui a data e a hora atuais para comandos mais antigos. Também quero estender o script para fazer backup incremental do arquivo de saída do histórico.

#!/bin/bash
. ~/.bash_profile
HISTFILE=~/.bash_history
set -o history
history >/home/user/hist_'date "+%d%b%y%T"'
    
por SunLynx 07.07.2015 / 07:51

2 respostas

4

Não é exatamente o que você queria, mas você pode obter bash para adicionar carimbos de hora a cada linha do histórico automaticamente. Basta definir, para o seu exemplo:

HISTTIMEFORMAT="%d%b%y%T "

O comando history sem argumentos mostrará suas entradas do histórico assim:

23Jul1515:48:14 ls -ld .

No entanto, o comando history -w sempre grava o arquivo de histórico no formato interno de:

#1437659315
ls -ld .

i.e. em 2 linhas, a primeira linha contém o tempo em segundos "desde a época" (ou seja, 1 de janeiro de 1970) com um # na frente para que não seja confundido com um comando.

    
por 07.07.2015 / 09:11
3

No bash, há uma opção que instrui o bash a registrar um timestamp com cada comando. Você faz isso atribuindo um valor útil à variável de ambiente HISTTIMEFORMAT . Na% man_de% manpage:

If this variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated with each history entry displayed by the history builtin. If this variable is set, time stamps are written to the history file so they may be preserved across shell sessions. This uses the history comment character to distinguish timestamps from other history lines.

No meu ambiente, eu uso

HISTTIMEFORMAT="%s (%H:%M:%S):"

Para que os comandos possam ser classificados facilmente ( bash é registro de data e hora em segundos) e legível por humanos. No meu shell, quando digito %s , vejo algo como o seguinte:

3  1437664568 (17:16:08):man bash
4  1437664699 (17:18:19):history

EDIT: pergunta OP não totalmente respondida.

Also I want to extend the script to take incremental backup of the history output file

Não tenho certeza do que você quer dizer com "backup incremental" do arquivo de histórico. Talvez você queira simplesmente que o histórico seja feito periodicamente. Existem algumas abordagens que você pode seguir:

  • Defina a variável PROMPT_COMMAND com history para atualizar continuamente o comando history após cada chamada (em oposição a aguardar pelo logout).
  • Trava o sinal DEBUG com uma função que você define. Toda vez que um comando é inserido, a função será chamada. De dentro da função você pode fazer tudo. (Um pouco mais confiável do que PROMPT_COMMAND).
  • cronjob para copiar / arquivar periodicamente o arquivo de histórico.
por 23.07.2015 / 17:18