记录输入的命令html
history命令能够查看用户输入过的命令,一个典型history命令输出以下:nginx
980 2017-05-29 20:17:37 cd -
981 2017-05-29 20:17:41 cat index.html
982 2017-05-29 20:20:11 vim index.html
983 2017-05-29 20:39:18 cd -
984 2017-05-29 20:39:25 cd /var/log/nginx/
985 2017-05-29 20:39:27 vim access.log
986 2017-05-29 20:50:10 netstat -ntlp
987 2017-05-31 11:04:39 tmux a -t0
988 2017-05-31 11:15:42 exit
989 2017-05-31 12:32:38 tmux a -t0ubuntu
记录IPvim
为了记录用户的IP,须要首先获取用户的登陆IP。因为在用户登入期间,会话不会断开,因此只需获取一次便可。bash
获取IP命令: who am i | awk '{print $NF}' | sed -e 's/[()]//g' 。ssh
接着按照 username@ip datetime command 的格式记录用户的命令,这须要设置HISTTIMEFORMAT的值。获取IP和设置命令格式结合起来:工具
IP=who am i | awk '{print $NF}' | sed -e 's/[()]//g'
export HISTTIMEFORMAT=$USER@$IP %F %T.net
为了让上述命令对全部用户生效,可将其写到/etc/profile文件中。设置完毕后(可能须要从新登陆,或者用source命令从新加载/etc/profile),history命令输出以下相似结果:code
412 root@8.8.8.8 2017-06-02 22:03:27 netstat -nt
414 root@8.8.8.8 2017-06-02 22:03:38 netstat -ntpl
415 root@8.8.8.8 2017-06-03 14:17:09 history
416 root@8.8.8.8 2017-06-03 14:17:30 tmux ls
417 root@8.8.8.8 2017-06-03 14:17:34 tmux
418 root@8.8.8.8 2017-06-03 14:17:49 tmux a -t0server
history命令的内容保存在用户的~/.bash_history文件中,用户可随时更改或者清除。为了统一管理用户的命令记录,咱们但愿用户执行命令后,执行的命令能输出到某个文件内。达到这个目的须要 PROMPT_COMMAND 环境变量的协助。
设置PROMPT_COMMAND将用户的上一条命令log到syslog里面去:
export PROMPT_COMMAND="history 1 | logger -t cmd_log -p user.notice"
logger命令将信息输出到/var/log/messages中。任意输入一个命令,而后打开/var/log/messages,会看到已经记录在案。/var/log/messages文件只有root有权限访问,从而达到了记录用户IP和命令的目的。
若是你熟悉syslog,能够将命令记录输出到单独的文件中。这须要在logger命令的-p选项中指定工具名称和等级,例如local2.notice,而后编辑/etc/rsyslog.conf,将local2的信息输出到单独文件: local2.* /var/log/command.log,最后重启rsyslog服务。
经过如上设定,便可在用户无感知的状况下log用户的IP、时间和操做命令。
对用户来讲,如何绕过?能够有两种方式:
将命令写到脚本,执行脚本; unset PROMPT_COMMAND变量。
参考
https://askubuntu.com/questions/93566/how-to-log-all-bash-commands-by-all-users-on-a-server
http://moper.me/ssh-audit-chats.html
http://zhu8337797.blog.163.com/blog/static/170617549201222912830483/