arquivo de histórico de data e hora salvos

1

Eu vi muita documentação sobre como registrar a data e a hora da saída do comando history. Mas como você faria para marcar um arquivo de histórico salvo? Por exemplo, eu tenho uma configuração de servidor para salvar o histórico bash de cada usuário em /root/history/.bash_history-$USER. Isso é feito através de uma linha em /root/.bash_profile

export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')

Eu adicionei a linha:

export HISTTIMEFORMAT="%d/%m/%y %T "

para /root/.bash_profile e originou-o. No entanto, os timestamps não são colocados nos arquivos, você só os vê quando executa o comando history. Como posso configurar isso para fazer as duas coisas?

EDITAR:

Eu adicionei as linhas no meu arquivo .bashrc como sugerido:

export HISTSIZE=3000
export HISTFILESIZE=5000
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print   $1}')
format_history () {
 perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9]  {10}.*\n.*$)/"# ".localtime($1)."#\n#$1"/ge;print $string;'    /root/history/.bash_hist-$(who -m | awk '{print $1}')
}
export HISTTIMEFORMAT="%d/%m/%y %T "
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"

Agora, quando tento abrir meu arquivo de histórico, usando vim, cat ou menos, vejo:

command I ran
#Thu Mar Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed Dec Wed     Dec Wed Dec Wed Dec Wed Dec 31 18:00:31 1969 18:00:31 1969 18:00:31 1969   18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969  18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 18:00:31 1969 14:26:02 2016

EDIT 3:

Depois de fazer as alterações mais recentes:

# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
# Fri Apr  1 15:26:35 2016#
#1459542395
command
    
por user53029 31.03.2016 / 17:24

1 resposta

2

Você poderia fazer algo como

perl -Mposix -pe 's/^#([0-9]{10})/POSIX::strftime( "%d\/%m\/%y %T", gmtime($1))/eg' .bash_history > readable_history

para substituir os registros de data e hora da época no arquivo por formatados. Para fazer isso no lugar, você poderia modificá-lo para inserir os tempos formatados como comentários acima de cada linha, mas certifique-se de colocar um espaço antes do primeiro número para que o bash não tente interpretá-lo como seu próprio timestamp ao ler o histórico arquivo.

Editar: aqui está a linha para fazer isso sem danificar o arquivo de histórico:

perl -Mposix -i -pe 's/^#([0-9]{10})(.*)/"# ".POSIX::strftime( "%d\/%m\/%y %T", gmtime($1))."\n#$1$2"/ge' .bash_history

Isso criará um arquivo assim:

#1356431101 command arg arg
#1356531101 command2 arg2

Veja assim:

# 25/12/12 10:25:01
#1356431101 command arg arg
# 26/12/12 14:11:41
#1356531101 command2 arg2

Edit2: Colocar isso no meu bashrc fez o truque para mim:

format_history () {
    perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9]{10}.*\n.*$)/"# ".localtime($1)."#\n#$1"/ge;print $string;' ~/.bash_history
}
export HISTTIMEFORMAT="%d/%m/%y %T "
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"

Edição final - Aqui está uma versão melhor do regex que não deve duplicar nada:

perl -i -e '$/=undef;my $string=<>;$string=~s/(#\s[^\n]*\n)?#(\d{10}\n)/"# ".localtime($+)."\n#$+"/ge;print $string;' your_history_file_name_here
    
por 31.03.2016 / 20:51