30
2020
11

将Linux的bash命令执行记录发送至远程日志服务器

众所周知,Linux服务器运维的核心,还是命令行,服务器的没一个操作都是通过一条一条的命令执行的,所以对于Linux上运行的每一条命令做日志记录下来,就成了Linux运维里比较关键的一个内容了。

我们知道Linux内核的服务器可以通过history命令查看命令执行的历史记录,但是这种方法有很多局限性,所以我们这次着重讨论的,是如何把Linux上执行的每一条命令作为日志发送给日志服务器。


让Linux将命令执行的历史记录作为日志发送给日志服务器有很多种方法,很多都是通过修改bash源码实现的,这个方法虽然彻底但是我感觉对我等Linux基础不是很完善的人来说不是很友好,所以本文主要介绍通过trap和logger命令来实现的方法。

首先我们来介绍一下trap和logger指令:

1、logger命令是基于Linux的操作系统基本都有的shell命令接口,通过这个接口我们就可以使用Syslog的系统日志模块将日志发送给对应的日志服务器,logger命令后面有很多参数,如下图所示,我们这次的需求是将日志发送给日志服务器,所以其中-n参数是必须要使用到的,其他的参数就根据实际需求酌情使用了。

-d, --udp:使用UDP发送日志,默认使用TCP

-i, --id:每一次logger行为的进程ID

-f, --file file_name:记录特定的文件

-h, --help:显示帮助文本并退出

-n, --server:写入指定的远程syslog服务器

-P, --port port_num:使用指定的UDP端口

-p, --priority priority_level:指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式

-s, --stderr:输出标准错误到系统日志。

-t, --tag tag:给记录打上标记

-u, --socket socket:写入指定的socket,而不是到内置系统日志例程。

-V, --version:显示版本信息并退出

2、trap用来捕捉shell产生的信号,这些信号主要分为三类,分别是EXIT(从一个函数中退出或整个脚本执行完毕),ERR(当一条命令执行不成功时)和DEBUG(脚本中每一条命令执行之前),所以我们可以通过trap * DEBUG,实现执行bash命令之前,运行*代表的内容,我们只要再写一个函数将需要执行的命令做成日志并发送给日志服务器,然后trap (这个函数) DEBUG,就可以实现每一条执行的命令都发送给日志服务器的效果了


知道了logger和trap命令,我们就可以开始实现这个需求了,这里还需要用到Linux的环境变量,也就是/etc/profile文件,这个文件我相信玩过Linux的朋友们应该都很熟悉,我们可以通过在这个文件里写一行trap命令,通过trap DEBUG去执行logger命令,也就是在/etc/profile文件最后加上下面这一行,就可以了。

trap 'logger -p local1.notice -n 192.168.10.10 -- $SSH_CONNECTION $USER $PWD $BASH_COMMAND' DEBUG

这个内容是什么意思我想有了刚才对logger和trap的解释,大家应该都能看得懂了吧?logger命令的参数可以根据实际情况和实际需求添加,我这里只用了-p,-i和-n参数,然后$SSH_CONNECTION指的是当前SSH会话的信息,$USER指的是当前用户,$PWD指的是当前的目录,$BASH_COMMAND是指执行的命令。


配置完成后,登出当前用户,然后再重新登录一次,日志就会自动发送到日志服务器上了。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。