O poder do "comando de histórico" do Linux no Bash Shell
Usamos o comando history frequentemente em nossos trabalhos de rotina diária para verificar o histórico do comando ou para obter informações sobre o comando executado pelo usuário. Neste post, veremos como podemos usar o comando histórico de forma eficaz para extrair o comando que foi executado pelos usuários no shell Bash. Isto pode ser útil para fins de auditoria ou para descobrir qual comando é executado em qual data e hora.
Por padrão, date e timestamp não serão vistos durante a execução do comando history. No entanto, o shell bash fornece ferramentas CLI para editar o histórico de comandos do usuário. Vamos ver algumas dicas e truques úteis e o poder do comando history.
1. Liste os últimos/todos os comandos executados no Linux
A execução do comando history simples no terminal mostrará uma lista completa dos últimos comandos executados com números de linha.
[narad@tecmint ~]$ history
1 PS1='\e[1;35m[\u@\h \w]$ \e[m '
2 PS1="\e[0;32m[\u@\h \W]$ \e[m "
3 PS1="\u@\h:\w [\j]$ "
4 ping google.com
5 echo $PS1
6 tail -f /var/log/messages
7 tail -f /var/log/messages
8 exit
9 clear
10 history
11 clear
12 history
2. Liste todos os comandos com data e carimbo de data/hora
Como encontrar dataetimestamp no comando? Com o comando 'exportar' com variável exibirá o histórico do comando com o carimbo de data e hora correspondente quando o comando foi executado.
[narad@tecmint ~]$ export HISTTIMEFORMAT='%F %T '
1 2013-06-09 10:40:12 cat /etc/issue
2 2013-06-09 10:40:12 clear
3 2013-06-09 10:40:12 find /etc -name *.conf
4 2013-06-09 10:40:12 clear
5 2013-06-09 10:40:12 history
6 2013-06-09 10:40:12 PS1='\e[1;35m[\u@\h \w]$ \e[m '
7 2013-06-09 10:40:12 PS1="\e[0;32m[\u@\h \W]$ \e[m "
8 2013-06-09 10:40:12 PS1="\u@\h:\w [\j]$ "
9 2013-06-09 10:40:12 ping google.com
10 2013-06-09 10:40:12 echo $PS1
Significado das variáveis HISTTIMEFORMAT
%F Equivalent to %Y - %m - %d
%T Replaced by the time ( %H : %M : %S )
3. Filtrar comandos no histórico
Como podemos ver, o mesmo comando está sendo repetido várias vezes na saída acima. Como filtrar comandos simples ou não destrutivos no histórico? Use o seguinte comando ‘export’ especificando o comando em HISTIGNORE=’ls -l:pwd:date:’ não será salvo pelo sistema e não será mostrado no comando de histórico.
[narad@tecmint ~]$ export HISTIGNORE='ls -l:pwd:date:'
4. Ignore comandos duplicados no histórico
O comando abaixo nos ajudará a ignorar entradas duplicadas de comandos feitas pelo usuário. Apenas uma única entrada será mostrada no histórico, se um usuário executar o mesmo comando várias vezes em um prompt do Bash.
[narad@tecmint ~]$ export HISTCONTROL=ignoredups
5. Desativar comando de exportação
Desative o comando de exportação instantaneamente. Execute o comando unset export com a variável, um por um, quaisquer comandos que tenham sido exportados pelo comando export.
[narad@tecmint ~]$ unset export HISTCONTROL
6. Salve o comando de exportação permanentemente
Faça uma entrada como segue em .bash_profile para salvar o comando export permanentemente.
[narad@tecmint ~]$ vi .bash_profile
.bash_profile
Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
User specific environment and startup programs
export HISTCONTROL=ignoredups
PATH=$PATH:$HOME/bin
export PATH
7. Liste os comandos executados do usuário específico
Como ver o histórico de comandos executados por um usuário específico. Bash mantém registros do histórico em um arquivo ‘~/.bash_history’. Podemos visualizar ou abrir o arquivo para ver o histórico de comandos.
[narad@tecmint ~]$ vi .bash_history
cd /tmp/
cd logstalgia-1.0.3/
./configure
sudo passwd root
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
./configure
make
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc++
apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc
apt-get install make
mysql -u root -p
apt-get install grsync
apt-get install unison
unison
8. Desative o armazenamento do histórico de comandos
Algumas organizações não mantêm histórico de comandos devido à política de segurança da organização. Neste caso, podemos editar o arquivo .bash_profile (é o arquivo oculto) do usuário e fazer uma entrada conforme abaixo.
[narad@tecmint ~]$ vi .bash_profile
.bash_profile
Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
User specific environment and startup programs
PATH=$PATH:$HOME/bin
HISTSIZE=0
export PATH
.bash_profile (END)
Salve o arquivo e carregue as alterações com o comando abaixo.
[narad@tecmint ~]$ source .bash_profile
Nota: Se você não deseja que o sistema se lembre dos comandos que você digitou, basta executar o comando abaixo, que desativará ou interromperá a gravação do histórico imediatamente.
[narad@tecmint ~]$ export HISTSIZE=0
Dicas: pesquise ‘HISTSIZE’ e edite no arquivo ‘/etc/profile’ com superusuário. A alteração no arquivo terá efeito global.
9. Excluir ou limpar histórico de comandos
Com as setas para cima e para baixo, podemos ver comandos usados anteriormente que podem ser úteis ou irritá-lo. Excluindo ou limpando todas as entradas da lista de histórico do bash com as opções ‘-c’.
[narad@tecmint ~]$ history -c
10. Comandos de pesquisa no histórico usando o comando Grep
Pesquise o comando por meio de ‘.bash_history’ canalizando seu arquivo de histórico para ‘grep’ conforme abaixo. Por exemplo, o comando abaixo irá pesquisar e encontrar o comando ‘pwd’ na lista de histórico.
[narad@tecmint ~]$ history | grep pwd
113 2013-06-09 10:40:12 pwd
141 2013-06-09 10:40:12 pwd
198 2013-06-09 15:46:23 history | grep pwd
202 2013-06-09 15:47:39 history | grep pwd
11. Pesquise o comando executado por último
Pesquise o comando executado anteriormente com o comando 'Ctrl+r'. Depois de encontrar o comando que procura, pressione ‘Enter‘ para executar o mesmo, caso contrário pressione ‘esc‘ para cancelá-lo.
(reverse-i-search)`source ': source .bash_profile
12. Recuperar o último comando executado
Lembre-se de um comando específico usado anteriormente. A combinação dos comandos Bang e 8 (!8) irá recuperar o comando número 8 que você executou.
[narad@tecmint ~]$ !8
13. Recuperar comando específico executado por último
Lembre-se do comando usado anteriormente (netstat -np | grep 22) com ‘!’ e seguido por algumas letras desse comando específico.
[narad@tecmint ~]$ !net
netstat -np | grep 22
(No info could be read for "-p": geteuid()=501 but you should be root.)
tcp 0 68 192.168.50.2:22 192.168.50.1:1857 ESTABLISHED -
tcp 0 0 192.168.50.2:22 192.168.50.1:2516 ESTABLISHED -
unix 2 [ ] DGRAM 12284 - @/org/freedesktop/hal/udev_event
unix 3 [ ] STREAM CONNECTED 14522 -
unix 2 [ ] DGRAM 13622 -
unix 3 [ ] STREAM CONNECTED 12250 - @/var/run/hald/dbus-ujAjOMNa0g
unix 3 [ ] STREAM CONNECTED 12249 -
unix 3 [ ] STREAM CONNECTED 12228 - /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 12227 -
Tentamos destacar o poder do comando histórico. No entanto, isso não é tudo. Por favor, compartilhe sua experiência com o comando de histórico conosco através de nossa caixa de comentários abaixo.