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.