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

Tin*_*Tin 25 bash logging

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

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

小智 38

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

sudo -e /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)

附加到该文件的末尾:

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

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

sudo -e /etc/rsyslog.d/bash.conf
Run Code Online (Sandbox Code Playgroud)

而内容...

local6.*    /var/log/commands.log
Run Code Online (Sandbox Code Playgroud)

重启 rsyslog:

sudo service rsyslog restart
Run Code Online (Sandbox Code Playgroud)

登出。登录。瞧!

但我忘记了日志轮换:

sudo -e /etc/logrotate.d/rsyslog
Run Code Online (Sandbox Code Playgroud)

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

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message
Run Code Online (Sandbox Code Playgroud)

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

/var/log/commands.log
Run Code Online (Sandbox Code Playgroud)

节省。

  • 我相信用户可以通过简单地重置或取消设置 `PROMPT_COMMAND` 或 exec-ing 到非 bash shell 来轻松停用它。 (2认同)

Sab*_*con 5

进程记帐系统在这方面可能会有所帮助,特别是提供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


小智 5

你可以使用史努比

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

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

  • @BostjanSkufca 无需生气。这只是一个堆栈交换的事情,至少有合理的独立答案。如果您强烈反对添加步骤,那也是您的愿望。我的反对票仍然存在。可能有人会投票赞成。 (2认同)