Disassembler

Artificial intelligence is no match for natural stupidity.
26října2011

Bash: Nastavení podrobné historie


Výchozí chování historie bashe je nastaveno tak, že uživatel si svoji historii motá v paměti a při odhlášení je zapsána do souboru ~/.bash_history. Pokud ale tento již existuje, je přepsán, takže starší historie je ztracena. Na důležitějších systémech je ale toho chování často nežádoucí, protože chceme mít dokonalý přehled o tom co se dělo. Nejlépe uchovávat historii ze všech sezení, zapisovat do ní ihned po zadání příkazu a vidět v ní, kdy byl jaký příkaz zadán.

.bashrc


Veškeré úpravy budou provedeny v souboru spouštěném při přihlašování do interaktivního shellu. Na deb-based systémech tedy /etc/bash.bashrc, na CentOSu třeba /etc/bashrc nebo adresář /etc/profile.d/. Pokud úpravu chcete použít pro jediného uživatele, použijte ~/.bashrc.

První věc, kterou určitě nastavte, je maximální velikost historie. Ve výchozím stavu si .bash_history pamatuje 500 příkazů a to je, vzhledem k tomu, že budete logovat všechno a odevšud, málo. Ve svém konfiguračním souboru tedy upravte

HISTSIZE=10000
HISTFILESIZE=20000

Proměnná HISTSIZE určuje, kolik příkazů si bude historie pamatovat a proměnná HISTFILESIZE udává maximální počet řádků souboru .bash_history. HISTFILESIZE je dvakrát tak velká jako HISTSIZE proto, že později budeme ukládat i časová razítka k jednotlivým příkazům a ty u každého příkazu sežerou řádek navíc.

Dále příkazem

shopt -s histappend

řeknete bashi, že má do .bash_history přidávat řádky, místo toho, aby jej celý přepisoval.

Bash má šikovnou proměnnou PROMPT_COMMAND, do které můžete uložit příkaz, který se vykonává těsně po zadání příkazu do interaktivního shellu, ale ještě před jeho vykonáním. Tuhle proměnnou využijte tak, že do ní strčte příkaz k vyplivnutí neuložené historie do souboru. Tím docílíte toho, že v .bash_history se prováděný příkaz objeví okamžitě po jeho odpálení a ne až při odhlašování uživatele, jak je tomu ve výchozím nastavení.

PROMPT_COMMAND="history -a"

Nezapomeňte zkontrolovat, zda bashi někdo neřekl, že si některé příkazy může dovolit neukládat. Tohle chování nastavuje proměnná HISTCONTROL. Volby jsou:

Pro logování úplně všeho by tedy neměla být proměnná HISTCONTROL vůbec nastavena.

Jako poslední krok nastavte formát data a času. Do proměnné HISTTIMEFORMAT v klasickém strftime formátu napište, jak si přejete, aby datum vypadalo.

 HISTTIMEFORMAT="(%F %T)  "

Výsledek


Můj .bashrc vypadá takto:

[ -z "$PS1" ] && return
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

HISTSIZE=10000
HISTFILESIZE=20000
HISTTIMEFORMAT="(%F %T)  "
shopt -s histappend
PROMPT_COMMAND="history -a"

export EDITOR="vim"
shopt -s checkwinsize

eval "`dircolors`"
COLOR="--color=auto"

alias ls='ls $COLOR'
alias ll='ls $COLOR -la'
alias l='ls $COLOR -a'
alias grep='grep $COLOR'

a v historii vidím úplně vše, takže v případě, že na svůj systém pustím i někoho jiného (i přesto, že ženské, auta a rootovská práva se nepůjčují) mám perfektní přehled o tom, co a kdy prováděl.

 [root@localhost ~]# history
    1  (2011-10-26 13:10:53)  cd /etc/sysconfig/networking/devices/
    2  (2011-10-26 13:10:54)  ll
    3  (2011-10-26 13:10:57)  cd ../profiles
    4  (2011-10-26 13:10:58)  ll
    5  (2011-10-26 13:11:03)  ifconfig -a
    6  (2011-10-26 13:11:34)  halt
    7  (2011-10-26 13:13:07)  cd /mnt
    8  (2011-10-26 13:13:08)  ll
    9  (2011-10-26 13:13:11)  mount -a
   10  (2011-10-26 13:13:13)  ll
   11  (2011-10-26 13:13:14)  ll
   12  (2011-10-26 13:13:28)  mount -t iso9660 /dev/cdrom /mnt
   13  (2011-10-26 13:13:30)  ll
   14  (2011-10-26 13:13:32)  cd ..
   15  (2011-10-26 13:14:03)  history