如何记录服务器上所有用户的所有Bash命令?

我们的小公司运行一个Ubuntu Server 11.10,有几个人有SSH访问权限。 有时也会使用实际的终端。 我们如何在本地记录所有运行的Bash命令,以及用户和时间戳?

我们可以假设没有人是邪恶的并积极地试图避免日志记录,但我们仍然希望用户不要对他们的日志文件进行直接写访问。 必须正确处理同时会话。

对于BASH shell,编辑系统范围的BASH运行时配置文件:

sudo -e /etc/bash.bashrc 

附加到该文件的末尾:

 export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"' 

使用新文件设置“local6”的日志记录:

 sudo -e /etc/rsyslog.d/bash.conf 

而内容……

 local6.* /var/log/commands.log 

重启rsyslog:

 sudo service rsyslog restart 

登出。 登录。瞧!

但我忘记了日志轮换:

 sudo -e /etc/logrotate.d/rsyslog 

有一个日志文件列表以相同的方式旋转…

 /var/log/mail.warn /var/log/mail.err [...] /var/log/message 

因此,在该列表中添加新的bash-commands日志文件:

 /var/log/commands.log 

保存。

在这方面,进程计费系统可能是有用的,特别是提供lastcomm和ac命令的acct包。

ac命令打印出有关用户连接时间的统计信息,以小时为单位。 这是用户通过SSH或串行终端远程连接到系统的时间,或者在控制台上。

lastcomm命令显示有关先前执行的命令的信息。 最新的条目在列表的顶部给出。 还显示每个进程使用的CPU时间总量。

可能有用的旧教程如下:

http://www.linuxjournal.com/article/6144?page=0,1

其他会计命令如last等可以在本教程中找到:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

您可以在这里找到一个脚本,将所有bash命令/内置函数记录到文本文件或syslog服务器中,而无需使用补丁或特殊的可执行工具。

非常容易部署,因为它是一个简单的shell脚本,需要在bash的初始化时调用一次。

它是免费的,我希望它符合您的需求。

你可以使用史努比 。

史努比记录器可能很适合您的目的。 它不是一个不可避免的日志记录解决方案,而是一个有用的工具,适合那些喜欢跟踪自己行为的勤奋管理员。

披露:我是史努比维护者。

要处理多个会话而不是覆盖历史文件,您必须将“shopt -s histappend”放在Bash启动文件中。 请参阅同样问题的这个问题。

尝试这个(上面的解决方案不会100%使用bash 4.3):

 export HISTTIMEFORMAT="%Y-%m-%d %T " export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;' 

这会记录日志并且它会阻止记录用于bash历史记录文件的时间戳。 需要陷阱,因为bash会在多次按strg + c后将信号发送到“subjob”(用bash 4.3测试)。 这将强制注销当前用户(例如使用sudo登录)

您也可以尝试安装帐户。 Acct会对您的Linux系统上的内容进行详细的审计跟踪。

 sudo apt-get install acct