linux 日志推送,Linux history记录发送到syslog日志

常用的shell有bash和csh,而history记录中,bash默认是不带命令操作时间的,csh带有记录时间,可以通过变量修改,查看历史命令的执行时间,不过history记录默认只保存1000条。想要所有的命令都进行命令,最好是将其保存到日志记录中。所以可以通过一些变量配置,配合logger发送给syslog进行保存。

一、bash shell设置

修改/etc/bashrc文件(SUSE下是/etc/bash.bashrc),增加如下内容:

PROMPT_COMMAND=$(history -a)

typeset -r PROMPT_COMMAND

function log2syslog

{

declare command

command=$BASH_COMMAND

#logger -p local1.notice -t bash -i -- $SSH_CONNECTION : $USER : $PWD : $command

logger -p local1.notice -t bash -i -- `echo $SSH_CLIENT|awk '{print $1}'` : $USER : $PWD : $command

}

trap log2syslog DEBUG

重新登陆后,所有的操作,都会在messages日志里保存,类似如下:

Jun 01 17:29:28 localhost bash[39095]: 10.212.143.73 : root : /root : ls --color=auto /var/log/messages

Jun 01 17:29:30 localhost bash[39132]: 10.212.143.73 : root : /root : vim /var/log/messages

Jun 01 17:29:45 localhost bash[39217]: 10.212.143.73 : root : /root : tail -2 /var/log/messages

Jun 01 17:29:50 localhost bash[39242]: 10.212.143.73 : root : /root : tail -5 /var/log/messages

不过上面的方法配置的时候,当使用rm进行删除操作时,使用的通配符会被转化为实际的名称,比如我使用rm -rf yum*,实际在日志中显示是:

rm -i -rf yum_save_tx.2019-05-20.06-00.6V7vWG.yumtx yum_save_tx.2019-05-20.06-00.XzlQAH.yumtx yum_

save_tx.2019-05-20.06-01.2KSPSS.yumtx yum_save_tx.2019-05-21.06-00.lyLtKt.yumtx yum_save_tx.2019-05-21.06-01.BrmpWA.yumtx yum_save_tx.2019-05-21.06-01.vQiTY8.yumtx yum

_save_tx.2019-05-22.06-00.kJv5it.yumtx yum_save_tx.2019-05-22.06-01.CkT5zP.yumtx yum_save_tx.2019-05-22.06-01.jsqrkw.yumtx yum_save_tx.2019-05-22.06-01.URz26T.yumtx yu

m_save_tx.2019-05-23.06-00.hM1irq.yumtx yum_save_tx.2019-05-23.06-01.VgeBd4.yumtx yum_save_tx.2019-05-23.06-01.YrZOrh.yumtx yum_save_tx.2019-05-24.06-01._uAjWZ.yumtx y

um_save_tx.2019-05-24.06-02.rasDiC.yumtx yum_save_tx.2019-05-24.06-02.Wo1r9T.yumtx yum_save_tx.2019-05-25.06-03.48Epkl.yumtx yum_save_tx.2019-05-25.06-04.F2o_9F.yumtx

yum_save_tx.2019-05-25.06-04.UeG1es.yumtx

这个有好处也有坏处,比如你在一个目录下,删除1万个文件,这些文件会在日志里有记录,不过日志文件会搞的比较大。

除了下面的操作方法,也可以通过配置PROMPT_COMMAND环境变量,配合tee进行实现:

PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -t "$USER[$$] $SSH_CONNECTION")'

更有甚者会通过修改bash源码,给其上一个patch,让其支持转存到log文件。具体可以参看:https://github.com/iamseth/bash-syslog

最终我使用的内容是:export PROMPT_COMMAND='msg=$(history 1 | { read x y; echo "$y"; }); logger -t user_cmd "${msg} by $USER from $SSH_CLIENT" >/dev/null'

二、csh设置

csh下有precmd 变量,可以修改其值,让其记将记录信息发送给log,增加/etc/profile.d/histroy.csh文件(必须以csh结尾,cshrc默认会在该位置找csh结尾的文件):

[root@localhost ~]# more /etc/profile.d/histroy.csh

alias precmd 'eval logger -p local5.info "CMDLOG PWD=$PWD \; USER=$USER \; COMMAND=\`history -h 1\`"'

不过上面的语句在使用时会出现rm 删除多个文件时异常的问题。所以优化后的结果是:

alias precmd 'set msg = `history -h 1` ; logger -t $REMOTEHOST $USER user_cmd "${msg} pwd $PWD" >/dev/null'

三、ksh设置

修改/etc/kshrc(redhat) 或 /etc/ksh.kshrc(SUSE,其实该文件是软链接的/etc/bash.bashrc) ,增加如下内容:

export PROMPT_COMMAND='msg=$(history 1 | { read x y; echo "$y"; });loginuser=$(who am i); logger -t user_cmd "${msg} by $USER from [$loginuser]" >/dev/null'

四、history自身记录

由于csh默认是有date +%s这样的信息在命令运行记录上(具体看.hisotry文件),bash默认在.bash_history上是没有时间记录的,所以可以使用/etc/profile或/etc/bashrc、/etc/bash.bashrc文件,增加如下内容:

HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "

export HISTTIMEFORMAT

五、history配置记录小结

这里以SUSE为例吧,我上面使用$USER $PWD $REMOTE $CLIENT这样的变量,实际上也可以自定义变更,然后在logger的时候调用,具体如下:

bash.bashrc:export PROMPT_COMMAND='msg=$(history 1 | { read x y; echo "$y"; });user=$(whoami);loginuser=$(who am i); logger -t user_cmd "${msg} by ${user} from [$loginuser]"'

csh.cshrc.local:alias precmd 'set msg = `history 1|cut -f3-|sed -e "s|{||g" | sed -e "s|}||g"` ; set user = `whoami` ; set loginuser = `who am i`; logger -t user_cmd "${msg} by ${user} from [$loginuser]" >/dev/null'

ksh.kshrc:export PROMPT_COMMAND='msg=$(history 1 | { read x y; echo "$y"; });user=$(whoami);loginuser=$(who am i); logger -t user_cmd "${msg} by ${user} from [$loginuser]"'

六、syslog配置

由于使用logger的时候,可以使用logger -p local1.notice 这样的参数指定日志级别,所以也可以在/etc/syslog.conf 或 /etc/rsyslog.conf 文件中指定此类日志的具体存放路径,配置如下:

local1.notice /var/log/history.log、

配置完成后,重启日志服务生效

# service syslog restart

# service rsyslog restart

如果是使用的syslog-ng,也可以通过如下过滤器,将日志过滤出来,再配合destination 、log 进行保存:

filter f_messages {

level(notice)

and facility(local1);

};

syslog-ng配置具体可以参考:https://github.com/balabit/syslog-ng-3.5/blob/master/debian/syslog-ng.conf

参考页面:https://access.redhat.com/solutions/296363 (里面logger部分写的不正确,官文文档也有不对的地方)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值