2011-08-25 66 views
5

出於好奇,我想知道,如果可以編寫bash腳本記錄在Bash/SSH會話中運行的所有命令。我知道history是假設記錄所有運行的命令,但它似乎是非常不可靠的!bash命令記錄器

今天早上我一直在搞搞,想出了下面的bash腳本,它記錄了用戶在終端中運行的內容,但並未正確運行所有命令。

prompt_read() { 
    echo -n 「$(whoami)@$(hostname):$(pwd)~$ 「 
    read userinput 
} 

prompt_read 

while :; do 
    if [[ $userinput != exit ]]; then 
    logger "logit $userinput" 
    bash -c "$userinput" 
    prompt_read 
    else 
    kill -1 $PPID 
    fi 
done 

是任何人都知道的任何更好,更記錄的命令比history

乾杯

回答

8

爲什麼歷史似乎不可靠,給你的是,因爲它只是在一個結束寫入歷史的原因可靠BASH會話,所以你可能會失去命令。

我有幾件事在我的bash簡介:

HISTFILESIZE=10000 # how many lines of history to store in the history file 

HISTSIZE=10000 # how many lines of history to store in a session (I think) 

HISTCONTROL=ignoredups # ignore duplicate commands 

shopt -s histappend # append history, rather than having sessions obliterate existing history 
PROMPT_COMMAND="history -a;$PROMPT_COMMAND" 

最後幾個是重要的,你的設置與PROMPT_COMMANDhistory -a創造歷史立即追加,而不是會後。並且設置shopt -s histappend將使bash會話附加到歷史文件,而不是覆蓋現有的歷史記錄。

一些更多的信息:http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

此外,如果這是對你有用,你可以改變你使用與HISTFILE環境變量特定的bash命令歷史記錄文件的名稱。

+1

+1,btw,也可以將'HISTFILE'設置爲,比如每個日期歷史文件。 – Hasturkun

+0

@Hasturkun - 謝謝你提到這一點。 – birryree

4

退房腳本:http://bashshell.net/commands/using-the-script-command/

它記錄出現在終端上的文件中,並IIRC它可以播放錄製的會話一切。

您可以將其設置爲用戶的外殼,以便在登錄時記錄所有內容。

+0

要重放它,你需要['scriptreplay'](http://manpages.ubuntu.com/manpages/intrepid/man1/scriptreplay.1.html)。 – birryree

2

你可以找到一個腳本here在不使用補丁或特殊可執行工具的情況下將所有'bash'命令/內建腳本記錄到文本文件或'syslog'服務器中。

您也可以直接在沒有syslog的情況下直接寫入日誌文件。

部署起來很簡單,因爲它是一個簡單的shell腳本,需要在'bash'初始化時調用一次。