#!/bin/bash
# 配置syslog服务器地址和端口
syslog_server="192.168.1.100"
syslog_port=514
# 打开UDP端口514接收syslog消息
nc -ul $syslog_port | while read message; do
# 将syslog消息发送到syslog服务器
echo "$message" | nc -w1 $syslog_server $syslog_port
done
该脚本使用nc命令打开UDP端口514接收syslog消息,并将其发送到指定的syslog服务器。你可以根据自己的需求修改syslog_server和syslog_port变量的值。注意,该脚本需要在root权限下运行,因为它需要打开网络端口。
在运行该脚本之前,你需要确保nc命令已经安装在你的系统上。在大多数Linux发行版中,nc命令默认已经安装了。如果你使用的是MacOS或Windows系统,则需要手动安装nc命令
Linux的系统日志文件一般存储在 /var/log 目录下,其中 /var/log/syslog 文件包含了系统各种事件的日志信息。我们可以使用Shell脚本来解析这个文件。
下面是一个简单的例子,可以解析syslog文件并输出其中的日志信息。解析规则通过配置参数来指定,可以根据需要自定义解析规则。
#!/bin/bash
# 配置解析规则
RULE_TIMESTAMP="%b %d %H:%M:%S"
RULE_PREFIX=""
RULE_SUFFIX=""
RULE_SEVERITY=""
RULE_FACILITY=""
RULE_MESSAGE=""
# 读取命令行参数
while getopts ":t:p:s:f:m:" opt; do
case $opt in
t) RULE_TIMESTAMP="$OPTARG"
;;
p) RULE_PREFIX="$OPTARG"
;;
s) RULE_SUFFIX="$OPTARG"
;;
f) RULE_FACILITY="$OPTARG"
;;
m) RULE_MESSAGE="$OPTARG"
;;
\?) echo "Invalid option -$OPTARG" >&2
;;
esac
done
# 解析syslog文件
while read line; do
# 匹配行首和行尾
line=`echo "$line" | sed "s/^$RULE_PREFIX//" | sed "s/$RULE_SUFFIX$//"`
# 获取时间戳
timestamp=`echo "$line" | grep -oE "$RULE_TIMESTAMP" | head -n1`
# 获取设施和严重性等级
facility=`echo "$line" | sed "s/$timestamp//" | grep -oE "<[^>]+>" | head -n1 | sed "s/[<>]//g"`
severity=`echo "$facility" | cut -d"." -f2`
facility=`echo "$facility" | cut -d"." -f1`
# 获取消息
message=`echo "$line" | sed "s/$timestamp//" | sed "s/<[^>]\+>//g" | sed "s/^ //"`
# 根据规则过滤消息
if [[ -n "$RULE_FACILITY" && "$RULE_FACILITY" != "$facility" ]]; then
continue
fi
if [[ -n "$RULE_SEVERITY" && "$RULE_SEVERITY" != "$severity" ]]; then
continue
fi
if [[ -n "$RULE_MESSAGE" && ! "$message" =~ $RULE_MESSAGE ]]; then
continue
fi
# 输出日志信息
echo "Time: $timestamp, Facility: $facility, Severity: $severity, Message: $message"
done < /var/log/syslog
通过命令行参数可以指定解析规则,例如:
./parse_syslog.sh -t "%b %d %H:%M:%S" -p "Feb 10" -s "myhost" -f "auth" -m "Failed password for root"
上述命令将输出包含“Failed password for root”消息的认证(auth)设施,且主机名(prefix)以“Feb 10”开头的所有日志信息。