2011-08-25 65 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'初始化时调用一次。