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


21

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

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

Answers:


32

对于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

保存。


忘记了我添加到答案中的日志轮换。

1
这种方法可行,但是我可以发明一种方法(使用csh,.bash_logout)。我会选择Sabacon的acct解决方案。这些都是优秀的读取:linuxjournal.com/article/6144beginlinux.com/blog/2010/01/...

2
我相信,只要重置或取消设置PROMPT_COMMAND或执行非bash shell ,用户就可以轻松停用它。
Stefan Lasiewski 2013年

1
@Benubird看起来好像有一些预设的设施级别,其中8个是local0-local7:en.wikipedia.org/wiki/Syslog。0表示紧急,7表示调试,6表示7,“正常运行消息”。
munchybunch 2014年

1
@yukashima,因为如果不删除日志,它们可能会变成大文件,所以旋转意味着旋转日志文件并删除较旧的文件,以使日志更小...
Badr Elmers,

4

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


作为命令记录器,lastcomm毫无意义。它仅记录已运行的可执行文件。不记录任何参数,开关或路径。
Phil_1984_

3

您可以使用snoopy

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

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


请在答案中提供有关安装和使用它的说明。
muru

1
史努比github页面上提供了详细的安装说明,这是当前的史努比主要资源:github.com/a2o/snoopy。我会在其他地方提供安装说明,因为主要位置是由设计维护的,而其他地方则不是。BTW自述文件刚刚更新为更结构化。
Bostjan Skufca 2014年

1
可能是吧。但是,即使没有使用此步骤所需步骤的摘要,这也是仅链接的答案,可能会被删除。
大师

1
好吧,我提供了一个替代性可行解决方案的指针。如果那不是这个网站的全部目的,那么它应该与我的帐户一起被删除。
Bostjan Skufca 2014年

2
@BostjanSkufca无需冒犯。拥有至少合理的独立答案只是一件Stack Exchange的事情。如果您强烈反对添加步骤,那就是您的愿望。我的选票仍然存在。有人可能会投票赞成。
大师

3

您可以在此处找到一个脚本,无需使用修补程序或特殊的可执行工具即可将所有bash命令/内置命令记录到文本文件或syslog服务器中。

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

它是免费的,希望它能满足您的需求。


1
这是一个很好的答案,但是最好将步骤和脚本包含在答案的正文中,而不是链接到您的博客。您能否编辑您的答案以包括此内容?
汤姆·布鲁斯曼

2
网站现在不可用
盖亚

0

为了处理多个会话而不覆盖历史文件,您必须将“ shopt -s histappend”放入Bash启动文件中。参见,关于同一问题的这个问题。


0

尝试一下(上述解决方案在bash 4.3中无法100%正常工作):

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登录)


0

您也可以尝试安装acct。Acct会详细跟踪Linux系统上正在执行的操作。

sudo apt-get install acct
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.