Vyhledávání na webu

Síla Linuxu "History Command" v Bash Shell


Příkaz history používáme často v našich každodenních rutinních úlohách ke kontrole historie příkazu nebo k získání informací o příkazu provedeném uživatelem. V tomto příspěvku uvidíme, jak můžeme efektivně použít příkaz historie k extrahování příkazu, který provedli uživatelé v prostředí Bash. To může být užitečné pro účely auditu nebo pro zjištění, jaký příkaz je proveden v jakém datu a čase.

Ve výchozím nastavení se při provádění příkazu historie nezobrazí datum a časové razítko. Bash shell však poskytuje nástroje CLI pro úpravu historie příkazů uživatele. Podívejme se na několik užitečných tipů a triků a sílu příkazu historie.

1. Seznam posledních/všech provedených příkazů v Linuxu

Provedením jednoduchého příkazu history z terminálu se zobrazí úplný seznam naposledy provedených příkazů s čísly řádků.

[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. Seznam všech příkazů s datem a časovým razítkem

Jak najít datum a časové razítko proti příkazu? Pomocí příkazu ‚export‘ s proměnnou zobrazí příkaz historie s odpovídajícím časovým razítkem, kdy byl příkaz proveden.

[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
Význam proměnných HISTTIMEFORMAT
%F Equivalent to %Y - %m - %d
%T Replaced by the time ( %H : %M : %S )

3. Filtrování příkazů v historii

Jak vidíme, stejný příkaz se ve výše uvedeném výstupu opakuje několikrát. Jak filtrovat jednoduché nebo nedestruktivní příkazy v historii?. Použijte následující příkaz „export“ zadáním příkazu v HISTIGNORE=’ls -l:pwd:date:’ nebude systémem uložen a nebude zobrazen v příkazu historie.

[narad@tecmint ~]$ export HISTIGNORE='ls -l:pwd:date:'

4. Ignorujte duplicitní příkazy v historii

Pomocí níže uvedeného příkazu nám pomůže ignorovat duplicitní příkazy provedené uživatelem. V historii se zobrazí pouze jeden záznam, pokud uživatel provede stejný příkaz vícekrát v Bash Prompt.

[narad@tecmint ~]$ export HISTCONTROL=ignoredups

5. Zrušte nastavení příkazu exportu

Zrušte za běhu příkaz exportu. Spusťte příkaz unset export s proměnnou jeden po druhém bez ohledu na příkazy, které byly exportovány příkazem export.

[narad@tecmint ~]$ unset export HISTCONTROL

6. Trvale uložit příkaz exportu

Chcete-li trvale uložit příkaz export, zadejte do .bash_profile následující záznam.

[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. Vypište konkrétní uživatelské příkazy

Jak zobrazit historii příkazů provedených konkrétním uživatelem. Bash uchovává záznamy o historii v souboru ‘~/.bash_history‘. Můžeme zobrazit nebo otevřít soubor, abychom viděli historii příkazů.

[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. Zakažte ukládání historie příkazů

Některé organizace neuchovávají historii příkazů kvůli bezpečnostní politice organizace. V tomto případě můžeme upravit soubor .bash_profile (je to skrytý soubor) uživatele a provést záznam, jak je uvedeno níže.

[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)

Uložte soubor a načtěte změny pomocí níže uvedeného příkazu.

[narad@tecmint ~]$ source .bash_profile

Poznámka: Pokud nechcete, aby si systém pamatoval příkazy, které jste zadali, jednoduše spusťte níže uvedený příkaz, který za běhu zakáže nebo zastaví záznam historie.

[narad@tecmint ~]$ export HISTSIZE=0

Tipy: Vyhledejte „HISTSIZE“ a upravte v souboru „/etc/profile“ pomocí superuživatele. Změna souboru se projeví globálně.

9. Odstraňte nebo vymažte historii příkazů

Pomocí šipek nahoru a dolů můžeme vidět dříve použitý příkaz, který může být užitečný nebo vás může rozčilovat. Smazání nebo vymazání všech záznamů ze seznamu historie bash pomocí voleb „-c“.

[narad@tecmint ~]$ history -c

10. Hledání příkazů v historii pomocí příkazu Grep

Prohledejte příkaz přes „.bash_history“ vložením souboru historie do „grep“, jak je uvedeno níže. Například níže uvedený příkaz vyhledá a najde příkaz „pwd“ v seznamu historie.

[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. Vyhledejte naposledy provedený příkaz

Vyhledejte dříve provedený příkaz pomocí příkazu Ctrl+r. Jakmile najdete hledaný příkaz, stiskněte „Enter“ pro provedení stejného, jinak jej zrušte stisknutím „esc“.

(reverse-i-search)`source ': source .bash_profile

12. Vyvolání posledního provedeného příkazu

Vyvolání dříve použitého konkrétního příkazu. Kombinace příkazu Bang a 8 (!8) vyvolá příkaz číslo 8, který jste provedli.

[narad@tecmint ~]$ !8

13. Vyvolejte Lastly Executed Specific Command

Vyvolejte dříve použitý příkaz (netstat -np | grep 22) s „!“ a za ním následují některá písmena tohoto konkrétního příkazu.

[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  -

Pokusili jsme se zdůraznit sílu velení historie. Tím to však nekončí. Podělte se s námi o své zkušenosti s řízením historie prostřednictvím našeho pole pro komentáře níže.