用日志记录Linux用户执行的每一条命令(history)

工作中,需要把用户执行的每一个命令都记录下来,并发送到日志服务器的需求,为此我做了一个简单的解决方案。这个方案会在每个用户退出登录 时把用户所执行的每一个命令都发送给日志守护进程rsyslogd,你也可通过配置“/etc/rsyslog.conf”进一步将日志发送给日志服务器

第一种方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# vi /etc/profile

#设置history格式

export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| \

awk ‘{print $NF}‘|sed -e ‘s/[()]//g‘`] "

#记录shell执行的每一条命令

export PROMPT_COMMAND=‘\

if [ -z "$OLD_PWD" ];then

export OLD_PWD=$PWD;

fi;

if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then

logger -t `whoami`_shell_cmd "[$OLD_PWD]$(history 1)";

fi ;

export LAST_CMD="$(history 1)";

export OLD_PWD=$PWD;‘

第二种方法

第一步:全局设置(这是一次性设置,需要root用户权限)

1

2

3

4

5

6

# vi /etc/profile

#用户登录时执行此脚本

#设置history显示格式

export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null\

| awk ‘{print $NF}‘|sed -e ‘s/[()]//g‘`] "

#登录时清空当前缓存 echo "" > .bash_history

第二步:不同用户分别设置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# source /etc/profile

# vi /home/user1/.bash_logout

#当用户退出登录时会执行此脚本

tmpfile="/tmp/`whoami`_history.tmp"

#把格式化的history记录到文件里

history > $tmpfile

#读取文件,一行一行把文件内容发送到给syslogd。

#不要试图用"history | logger"或"logger -f $tmpfile"来替代下面的代码,

#否则将只能记录前200行。

k=1

while read line; do

((k++))

logger -t `whoami`_shell_cmd "$line"

done < $tmpfile

rm -f $tmpfile

(如果还有其它用户需要监控,则重复第二步骤)

第三步:把日志发送给远程主机(可选)

1

2

3

# vi /etc/rsyslog.conf

#增加如下行,IP自己换,也可以用域名,@表示用UDP协议,@@表示用TCP协议

*.*  @192.168.0.1

1

不足之处:

1. 不能实时记录命令并发送log

2. 要记录终端桌面下的命令需要重启。
=========

时间: 2024-10-23 00:50:19

用日志记录Linux用户执行的每一条命令(history)的相关文章

对中级 Linux 用户非常有用的 20 个命令

本文转自http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users,请支持原创,此处只做记录 也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令的一个延伸. 第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户.在这里你将学会如何进行自定义搜索,知道正在进行的进程和停掉进程,如何使用Linux的强势功能和如何在系统内编译C,C++和JA

linux 用户和组管理相关的命令

                 linux 用户和组管理相关的命令 用户管理 useradd 建立用户帐号 语 法:useradd [options] LOGIN参 数: -u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs -o 配合-u 选项,不检查UID的唯一性 -g GID:指明用户所属基本组,可为组名,也可以GID -G GROUP1[,GROUP2,...]:为用户指明附加组,组必须事先存在 -c "COMMENT":用户的注释信息 -

shell 将变量当命令执行问题【多条命令同时执行问题】

shell将变量当命令执行问题[多条命令同时执行问题] 今天写了个shell脚本,脚本中需要将变量当做shell命令运行,通常的方法有多种,比如: `${var}` 将变量内容当shell命令行执行 $(${var}) 将变量内容当shell命令执行 ${var}将变量内容当shell命令执行[不推荐此种方法] 但是这3种方法只能运行单条命令,当命令是下面类型时就会有问题: VAR1='cd /home ;echo "hello";echo "good"' VAR2

利用PROMPT_COMMAND记录每个用户执行的历史命令

在/etc/profile里加入以下几行 export HISTORY_FILE=/var/log/command-`date '+%y-%m-%d'`.log export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### USER:$USER IP:$SSH_CLIENT PS:$SSH_TTY #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HIST

linux每日命令(30):Linux 用户及用户组相关文件、命令详解

阅读目录(Content) 一. 用户.用户组概念及其文件结构详解 二. 常用的用户.用户组shell命令 用户相关命令 useradd userdel usermod passwd 用户组相关命令 groupadd groupdel groupmod 三. 综合示例 1.建立两个用户组group1和group2,以及三个用户dennis.daniel.abigale,并且将前2个用户分配在group1用户组下,后一个分配在group2用户组下,并给dennis设置密码 2.改变abigale的

普通用户执行需要root权限的命令的方法

我们经常会需要让普通用户干需要root权限的活,如普通用户用date命令修改系统日期等.date命令需要root权限才能执行,解决这个问题又2个方法: 方法一: 由root用户执行chmod 4755 /bin/date 备注:也就是给date命令增加s权限位即设置setuid(4000),这样普通用户就可以执行date命令了,缺点也是很明显的,相当于去掉了date命令的root权限限制. 方法二: 给shell脚本加壳: #include "stdio.h"#include &quo

linux 定时执行任务 at atq atrm命令的使用

1.at命令在指定时刻执行指定的命令序列 at [-V] [-q 队列] [-f 文档名] [-mldbv] 时间 下面对命令中的参数进行说明.-V 将标准版本号打印到标准错误中.-q queue 使用指定的队列.队列名称是由单个字母组成,合法的队列名能够由a-z或A-Z.a队列是at命令的默认队列.-m 作业结束后发送邮件给执行at命令的用户.-f file 使用该选项将使命令从指定的file读取,而不是从标准输入读取.-l atq命令的一个别名.该命令用于查看安排的作业序列,他将列出用户排在

linux shell执行远程计算机上的命令或者脚本(ssh)

大数据平台下经常建立设计多个节点的集群需要统一部署,这就设计到守护进程或者部署脚本在不同节点执行,如果能在master机器上,统一执行脚本,一次性启动整个集群的服务,感觉很nice.因为,分享如下内容: 前提条件: 配置ssh免密码登陆 对于简单的命令: 如果是在远端节点执行几个命令,则: ssh [email protected] "cd /home ; ls" 注意点: 双引号,必须有.如果不加双引号,第二个ls命令在本地执行 分号,两个命令之间用分号隔开 对于远端执行脚本的方式:

linux服务器执行cd和ls等等命令都有卡顿现象问题记录

一 执行命令free -gh 1. free 命令显示系统内存的使用情况,包括物理内存.交换内存(swap)和内核缓冲区内存. 2. -g 表示以G单位显示, -m以兆单位显示,    h会在数字后面加单位(G,M) 3.下面先解释一下输出的内容: Mem 行(第二行)是内存的使用情况. Swap 行(第三行)是交换空间的使用情况. (假如用到了交换内存,那你的内存不足了,有钱直接+内存,没钱就减少占用内存的进程) total 列显示系统总的可用物理内存和交换空间大小. used 列显示已经被使