Answers:
对于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
保存。
PROMPT_COMMAND
或执行非bash shell ,用户就可以轻松停用它。
在这方面,进程记帐系统可能会有所帮助,特别是提供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 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登录)