Pesquisa de site

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.