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

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

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

我们可以假设没有人是恶意的并积极尝试避免记录,但我们仍然希望用户不要直接拥有对其日志文件的写访问权限。必须正确处理同时发生的会话。

答案1

对于 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 命令日志文件:

/var/log/commands.log

节省。

答案2

你可以使用史努比

Snoopy 日志记录器可能非常适合您的目的。它并非是不可避免的日志记录解决方案,而是一个适合喜欢跟踪自己操作的勤奋管理员的有用工具。

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

答案3

流程会计系统在这方面可能会有所帮助,特别是帐户提供 lastcomm 和 ac 命令的包。

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

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

这里有一个可能有用的旧教程:

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

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

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

答案4

为了避免多个会话覆盖历史文件,您必须将“shopt -s histappend”放入 Bash 启动文件中。另请参阅这个问题同样的问题。

相关内容