Bash history com data e hora: saber quem rodou o quê (e quando)
Como configurar o histórico do bash para registrar data e hora de cada comando, evitar perder histórico entre sessões, e por que o history sozinho não é auditoria.
Boa noite pessoal, tudo bem?
Em muitas empresas, escolas ou mesmo em casa, a gente precisa compartilhar quase tudo: computador, notebook, tablet. (Espaço no ônibus, trem e metrô nem estou considerando, ok? rs)
Brincadeiras à parte, uma rotina muito comum em TI é a administração de servidores e aplicações compartilhadas por várias pessoas. Quando tudo funciona, ótimo, todo mundo feliz. Agora, imagina quando acontece algum problema: um load alto, um disco que encheu do nada, um parâmetro que deixou a aplicação estranha...
De quem é a culpa? Quando começou? Que comando executaram? E aí começa a passagem de bastão:
- "Ahhhh, foi você!"
- "Não, só pode ter sido o cara da aplicação, que ativa os debugs e acaba com tudo."
- "Nada disso, deve ter sido aquela empresa de tuning que pediu a senha de root."
E isso se prolonga com todo mundo colocando a mão no servidor, até acontecer tudo de novo.
Data e hora no history
O bash tem uma variável só para isso. Edite o .bashrc do usuário:
$ vim ~/.bashrc
E adicione a linha:
export HISTTIMEFORMAT="%F %T "
Abra um novo terminal (ou rode source ~/.bashrc) e o comando history passa a mostrar:
$ history | tail -3
1021 2026-11-12 21:40:03 df -h
1022 2026-11-12 21:40:15 du -sh /var/log/*
1023 2026-11-12 21:41:02 grep error /var/log/messages
O %F é a data no formato ano-mês-dia e o %T é a hora. Na época eu usava %h/%d - %H:%M:%S, que mostra algo como Sep/08 - 12:26:13, mas sem o ano, o que atrapalha quando o histórico é longo.
Deixando o histórico mais útil
Mais algumas linhas que valem a pena no mesmo .bashrc:
# não grava comandos repetidos em sequência nem os que começam com espaço
export HISTCONTROL=ignoreboth
# quantidade de comandos na memória e no arquivo ~/.bash_history
export HISTSIZE=10000
export HISTFILESIZE=20000
# acrescenta ao arquivo em vez de sobrescrever (várias sessões abertas)
shopt -s histappend
# grava cada comando assim que ele termina, e não só no logout
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
O histappend e o history -a resolvem um problema clássico: com duas ou três sessões SSH abertas no mesmo servidor, a última que fecha sobrescreve o histórico das outras. Com essas linhas, nada se perde.
/etc/profile.d/, por exemplo /etc/profile.d/history.sh.
History não é auditoria
.bash_history pertence ao próprio usuário: ele pode apagar (history -c), editar o arquivo ou simplesmente usar outro shell. Serve muito bem para o dia a dia e para ajudar numa investigação, mas não vale como evidência.
Quando a pergunta "quem rodou o quê" precisa de uma resposta confiável, os caminhos são outros:
- Logs do sudo: todo comando executado via
sudofica registrado em/var/log/secure(Red Hat e derivados) ou/var/log/auth.log(Debian e Ubuntu), e também nojournalctl. Mais um motivo para não compartilhar a senha de root; - auditd: registra execuções e acessos no nível do kernel, e o usuário comum não consegue apagar. Dá para consultar com
ausearcheaureport; - Centralização de logs: mandar esses registros para um servidor de logs, para que nem o root local consiga apagar o rastro.
Considerações Finais
É uma configuração de cinco linhas que evita muita discussão. Com data e hora no histórico, a conversa deixa de ser "foi você" e passa a ser "às 21:41 alguém rodou isso aqui". E, quando o ambiente pedir auditoria de verdade, o caminho é sudo com usuário nominal e auditd.
Abraços e até a próxima!
:wq!
Post publicado originalmente em fevereiro de 2014 e atualizado em novembro de 2026.

Comentários
Postar um comentário