O requisito é capturar o histórico da linha de comando em um arquivo com data e hora específicas dos comandos, quando foram executados.
O script abaixo captura o histórico com data e hora, mas também atribui a data e 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"`
Comentários
- Não ' não use o histórico do shell para isso. Use contabilidade ou sudo (e comandos log sudo).
- Como usar contabilidade ou sudo para captura de histórico em um arquivo
- sudo pode ser configurado para capturar seu histórico (e até mesmo a saída tty ) em um arquivo (ou via syslog). O que você quer dizer com " contabilidade "?
- @SunLynx, consulte Como você pode registrar todos os comandos digitados
Resposta
Não exatamente o que você desejado, mas você pode fazer com que bash
adicione carimbos de data / hora a cada linha do histórico automaticamente. Basta definir, para seu exemplo:
HISTTIMEFORMAT="%d%b%y%T "
O comando history
sem argumentos mostrará as entradas do seu histórico como este:
23Jul1515:48:14 ls -ld .
O history -w
, entretanto, sempre grava o arquivo de histórico no formato interno de:
#1437659315 ls -ld .
ie 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.
Comentários
- Quero capturar o histórico diariamente, o script acima funciona, mas atribui a data atual a todos os comandos. Além disso, após cada comando, um número é gerado, o que eu não ' desejo. Se alguém puder ajudar, isso será realmente útil
- Não sei o que você quer dizer com " um número gera ". Você poderia editar sua pergunta original com um exemplo de quais arquivos deseja obter e seus conteúdos?
- 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 esta mensagem gera
- é difícil ler isso em um comentário. remova seus comentários e edite a pergunta que você escreveu originalmente.
Resposta
No bash, há uma opção que instrui o bash a registrar um carimbo de data / hora para cada comando. Você faz isso atribuindo um valor útil à variável de ambiente HISTTIMEFORMAT
. Da bash
página de manual:
Se esta variável for definida e não nula, seu valor será usado como um string de formato para
strftime(3)
para imprimir o carimbo de data / hora associado a cada entrada de histórico exibida pelo histórico integrado. Se esta variável for definida, os registros de data e hora são gravados no arquivo de histórico para que possam ser preservados nas sessões do shell. Isso usa o caractere de comentário de histórico para distinguir carimbos de data / hora de outras linhas de histórico.
Em meu ambiente, eu uso
HISTTIMEFORMAT="%s (%H:%M:%S):"
Para que os comandos possam ser classificados facilmente (%s
é timestamp em segundos) e legível por humanos. Em meu shell, quando digito history
, vejo algo como o seguinte:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDITAR: Pergunta de OPs não totalmente respondido.
Também quero estender o script para fazer backup incremental do arquivo de saída do histórico
Não tenho certeza do que você quer dizer com “backup incremental” do arquivo de histórico. Talvez você simplesmente queira fazer backup do histórico periodicamente. Existem algumas abordagens que você pode adotar:
- Defina a variável PROMPT_COMMAND com
history -a
para atualizar continuamente o comando de histórico após cada invocação (em vez de esperar pelo logout). - Capture o DEBUG sinalize com uma função que você define. Cada vez que um comando é inserido, a função é 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.
Comentários
- Obrigado pelas sugestões, mas eu ' testei acima. Você pode elaborar mais sobre a história -a. O script Shell está funcionando bem, mas os carimbos de hora incorretos.Este é um problema e outro é um número após cada comando que começa com #. por ex. # 1435987168.
- O
#1435987168
no arquivo de histórico é o carimbo de data / hora ! Existem algumas maneiras de convertê-lo em um formato amigável, incluindo: carregar o arquivo de histórico em bash comhistory -n _filename_
e, em seguida,history
. Ou você pode fazer algo assim:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
para exibir o histórico com os carimbos de data / hora. Portanto, ' é provavelmente que os carimbos de data / hora estão corretos, mas você tem um problema de localidade ou fuso horário? - Elabore em
history -a
?? A página do manual é um pouco enganosa. Ele anexa o histórico da sessão atual ao arquivo designado por $ HISTFILE. As chamadas subsequentes irão anexar o histórico gerado desde a última invocação (não ' t sobrescreve todo o arquivo repetidamente)