脚本分解

环境检测部分

检查操作系统

#!/bin/bash

# 检查是否为 Debian 类型
if [ -f /etc/debian_version ]; then
    echo "当前操作系统是 Debian 类型"
    SYSLOG_SERVICE="rsyslog"
    INSTALL_COMMAND="apt-get install -y"
    CONFIG_FILE="/etc/rsyslog.conf"
    RESTART_COMMAND="systemctl restart rsyslog"
    ID="debian"
elif [ -f /etc/redhat-release ]; then
# 检查是否为 Red Hat 类型
    echo "当前操作系统是 Red Hat 类型或其衍生版本"
    SYSLOG_SERVICE="rsyslog"
    CONFIG_FILE="/etc/rsyslog.conf"
    INSTALL_COMMAND="yum install -y"
    RESTART_COMMAND="systemctl restart rsyslog"
    ID="redhat"
else
    echo "不支持的 Linux 发行版。"
    exit 1
fi

检查是否存在rsyslog

# 步骤 2:检查 syslog 是否安装
if ! command -v $SYSLOG_SERVICE &> /dev/null && ! systemctl status rsyslog.service &> /dev/null; then
    echo "$SYSLOG_SERVICE 未安装。正在安装..."

    # 交互式询问是否有互联网连接
    read -p "是否有互联网连接?(y/n): " INTERNET_CONNECTION

    if [[ $INTERNET_CONNECTION == "y" ]]; then
        # 从互联网仓库安装
        $INSTALL_COMMAND $SYSLOG_SERVICE
    elif [[ $INTERNET_CONNECTION == "n" ]]; then
        # 从本地软件包安装
        if [[ $ID == "debian" || $ID == "ubuntu" ]]; then
            echo "正在使用本地 rsyslog 软件包安装..."
            dpkg -i /path/to/local/rsyslog/package.deb
            apt-get install -f   # 修复任何依赖
        elif [[ $ID == "centos" || $ID == "rhel" ]]; then
            echo "正在使用本地 rsyslog 软件包安装..."
            rpm -ivh /path/to/local/rsyslog/package.rpm
            yum install -f   # 修复任何依赖
        fi
    else
        echo "无效的输入。请输入 'y' 或 'n'。"
        exit 1
    fi

    # 检查安装是否成功
    if [ $? -ne 0 ]; then
        echo "$SYSLOG_SERVICE 安装失败。正在退出。"
        exit 1
    fi
fi

用户输入部分

#!/bin/bash

# 获取本机IP地址
LOCAL_IP=$(hostname -I | awk '{print $1}')

# 提示用户输入要转发 syslog 到的 IP 地址
read -p "请输入要转发 syslog 到的 IP 地址 [$LOCAL_IP]: " IP_ADDRESS
IP_ADDRESS=${IP_ADDRESS:-$LOCAL_IP}

# 提示用户输入 syslog 转发的协议
read -p "请输入 syslog 转发的协议 (tcp/udp): " PROTOCOL
PROTOCOL=${PROTOCOL:-udp}

# 提示用户输入 syslog 转发协议的端口
read -p "请输入 syslog 转发协议的端口 [514]: " PORT
PORT=${PORT:-514}

# 提示用户输入要记录的本机IP地址
read -p "请输入要记录的本机 IP 地址 [$LOCAL_IP]: " MY_IP
MY_IP=${MY_IP:-$LOCAL_IP}

# 提示用户输入是否开启web日志转发(y/n)
read -p "是否开启web错误日志收集?(y/n): " ENABLE_WEB_LOG_FORWARDING
ENABLE_WEB_LOG_FORWARDING=${ENABLE_WEB_LOG_FORWARDING:-n}

# 提示用户开启哪些类型的日志转发(类型.级别),循环实现,以横线-结束
# 创建一个数组来存储用户选择的日志类型和级别
DEFAULT_LOG_TYPES=("auth.*" "authpriv.*")
LOG_TYPES=("${DEFAULT_LOG_TYPES[@]}")

# 提示用户输入要开启的日志类型和级别,直到输入横线为止
while true; do
    read -p "请输入要开启的日志类型和级别 (类型.级别),或输入 - 结束: " LOG_TYPE
    if [[ $LOG_TYPE == "-" ]]; then
        break
    elif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; then
        echo "$LOG_TYPE 已经包含在默认值中,不需手动添加。"
    else
        LOG_TYPES+=("$LOG_TYPE")
    fi
done

# 打印用户选择的日志类型和级别
echo "您选择了以下日志类型和级别:"
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type"
done


echo "将 syslog 转发到 IP 地址: $IP_ADDRESS,协议: $PROTOCOL,端口: $PORT,本机ip为:$MY_IP,是否开启web日志转发:$ENABLE_WEB_LOG_FORWARDING"

web错误日志写入配置文件部分

如果ENABLE_WEB_LOG_FORWARDING为y,则将下面的内容写入

module(load="imfile")
# 监控文件变化
input(type="imfile"
    File="/var/log/nginx/error.log"
    Tag="NGINXERROR")
template(name="MyTemplate" type="string" string="%$MY_IP%: %timestamp% %hostname% %syslogtag% %msg%\n")
:syslogtag, isequal, "NGINXERROR" $IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate

写入到/etc/rsyslog.d/nginx-error.conf

脚本实现:

# 提示用户输入是否开启web日志转发
read -p "是否开启web错误日志收集?(y/n): " ENABLE_WEB_LOG_FORWARDING
ENABLE_WEB_LOG_FORWARDING=${ENABLE_WEB_LOG_FORWARDING:-n}

if [[ $ENABLE_WEB_LOG_FORWARDING == "y" ]]; then
    # 将配置写入文件
    echo "module(load=\"imfile\")" > /etc/rsyslog.d/nginx-error.conf
    echo "# 监控文件变化" >> /etc/rsyslog.d/nginx-error.conf
    echo "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.conf
    echo "template(name=\"MyTemplate\" type=\"string\" string=\"%$LOCAL_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.conf
    echo ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.conf

    echo "已将 web错误日志转发 配置写入 /etc/rsyslog.d/nginx-error.conf 文件"
else
    echo "未开启 web 日志转发,不写入web错误日志"
fi

日志类型进行转发的模式

对于用户输入的每一种日志类型,LOG_TYPES中的

template(name="MyTemplate" type="string" string="%$MY_IP%: %timestamp% %hostname% %syslogtag% %msg%\n")
LOG_TYPE @远程服务器IP:端口号/协议;MyTemplate

写入到/etc/rsyslog.d/wasb-remote.conf 中,按行隔开

# 将配置写入文件
CONF_FILE="/etc/rsyslog.d/wasb-remote.conf"
echo "" > $CONF_FILE  # 清空文件内容
echo "template(name=\"MyTemplate\" type=\"string\" string=\"%$MY_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> $CONF_FILE
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILE
    echo "" >> $CONF_FILE  # 添加空行分隔
done

echo "已将配置写入 $CONF_FILE 文件"

重启服务

重启rsyslog服务,并且打印出rsyslog服务的status命令的结果

#!/bin/bash

# 重启 rsyslog 服务
echo "正在重启 rsyslog 服务..."
systemctl restart rsyslog

# 打印 rsyslog 服务状态
echo "rsyslog 服务状态:"
systemctl status rsyslog

不包含环境检查的一键脚本

#!/bin/bash

# 获取本机IP地址
LOCAL_IP=$(hostname -I | awk '{print $1}')

# 提示用户输入要转发 syslog 到的 IP 地址
read -p "请输入要转发 syslog 到的 IP 地址 [$LOCAL_IP]: " IP_ADDRESS
IP_ADDRESS=${IP_ADDRESS:-$LOCAL_IP}

# 提示用户输入 syslog 转发的协议
read -p "请输入 syslog 转发的协议 (tcp/udp): " PROTOCOL
PROTOCOL=${PROTOCOL:-udp}

# 提示用户输入 syslog 转发协议的端口
read -p "请输入 syslog 转发协议的端口 [514]: " PORT
PORT=${PORT:-514}

# 提示用户输入要记录的本机IP地址
read -p "请输入要记录的本机 IP 地址 [$LOCAL_IP]: " MY_IP
MY_IP=${MY_IP:-$LOCAL_IP}

# 提示用户输入是否开启web日志转发(y/n)
read -p "是否开启web错误日志收集?(y/n): " ENABLE_WEB_LOG_FORWARDING
ENABLE_WEB_LOG_FORWARDING=${ENABLE_WEB_LOG_FORWARDING:-n}

# 提示用户开启哪些类型的日志转发(类型.级别),循环实现,以横线-结束
# 创建一个数组来存储用户选择的日志类型和级别
DEFAULT_LOG_TYPES=("auth.*" "authpriv.*")
LOG_TYPES=("${DEFAULT_LOG_TYPES[@]}")

# 提示用户输入要开启的日志类型和级别,直到输入横线为止
while true; do
    read -p "请输入要开启的日志类型和级别 (类型.级别),或输入 - 结束: " LOG_TYPE
    if [[ $LOG_TYPE == "-" ]]; then
        break
    elif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; then
        echo "$LOG_TYPE 已经包含在默认值中,不需手动添加。"
    else
        LOG_TYPES+=("$LOG_TYPE")
    fi
done

# 打印用户选择的日志类型和级别
echo "您选择了以下日志类型和级别:"
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type"
done


echo "将 syslog 转发到 IP 地址: $IP_ADDRESS,协议: $PROTOCOL,端口: $PORT,本机ip为:$MY_IP,是否开启web日志转发:$ENABLE_WEB_LOG_FORWARDING"

if [[ $ENABLE_WEB_LOG_FORWARDING == "y" ]]; then
    # 将配置写入文件
    echo "module(load=\"imfile\")" > /etc/rsyslog.d/nginx-error.conf
    echo "# 监控文件变化" >> /etc/rsyslog.d/nginx-error.conf
    echo "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.conf
    echo "template(name=\"MyTemplate\" type=\"string\" string=\"%$LOCAL_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.conf
    echo ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.conf

    echo "已将 web错误日志转发 配置写入 /etc/rsyslog.d/nginx-error.conf 文件"
else
    echo "未开启 web 日志转发,不写入web错误日志"
fi

template(name="MyTemplate" type="string" string="%$MY_IP%: %timestamp% %hostname% %syslogtag% %msg%\n")
LOG_TYPE @远程服务器IP:端口号/协议;MyTemplate

写入到/etc/rsyslog.d/wasb-remote.conf 中,按行隔开

# 将配置写入文件
CONF_FILE="/etc/rsyslog.d/wasb-remote.conf"
echo "" > $CONF_FILE  # 清空文件内容
echo "template(name=\"MyTemplate\" type=\"string\" string=\"%$MY_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> $CONF_FILE
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILE
    echo "" >> $CONF_FILE  # 添加空行分隔
done

echo "已将 日志类型.日志级别 配置写入 $CONF_FILE 文件"

包含环境检查的一键脚本

#!/bin/bash
# 检查是否为 Debian 类型
if [ -f /etc/debian_version ]; then
    echo "当前操作系统是 Debian 类型"
    SYSLOG_SERVICE="rsyslog"
    INSTALL_COMMAND="apt-get install -y"
    CONFIG_FILE="/etc/rsyslog.conf"
    RESTART_COMMAND="systemctl restart rsyslog"
    ID="debian"
elif [ -f /etc/redhat-release ]; then
# 检查是否为 Red Hat 类型
    echo "当前操作系统是 Red Hat 类型或其衍生版本"
    SYSLOG_SERVICE="rsyslog"
    CONFIG_FILE="/etc/rsyslog.conf"
    INSTALL_COMMAND="yum install -y"
    RESTART_COMMAND="systemctl restart rsyslog"
    ID="redhat"
else
    echo "不支持的 Linux 发行版。"
    exit 1
fi

# 步骤 2:检查 syslog 是否安装
if ! command -v $SYSLOG_SERVICE &> /dev/null && ! systemctl status rsyslog.service &> /dev/null; then
    echo "$SYSLOG_SERVICE 未安装。正在安装..."

    # 交互式询问是否有互联网连接
    read -p "是否有互联网连接?(y/n): " INTERNET_CONNECTION
    #防止找不到path
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    if [[ $INTERNET_CONNECTION == "y" ]]; then
        # 从互联网仓库安装
        $INSTALL_COMMAND $SYSLOG_SERVICE
    elif [[ $INTERNET_CONNECTION == "n" ]]; then
        # 从本地软件包安装
        if [ -f /etc/debian_version ]; then
            echo "正在使用debian类型 本地 rsyslog 软件包安装..."
            # todo 待补充
        echo "正在使用本地 rsyslog 软件包安装..."
        # 若path中找不到这个 修改path export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
            #根据实际的上传路径文件包名修改
          #  dpkg -i /path/to/local/rsyslog/package.deb
            dpkg -i /path/to/local/rsyslog/rsyslog_8.2302.0-1_amd64.deb
            apt-get install -f   # 修复任何依赖
        elif [ -f /etc/redhat-release ]; then
            echo "正在使用本地 rsyslog 软件包安装..."
            # todo 待补充
            #根据实际的上传路径文件包名修改
            rpm -ivh /path/to/local/rsyslog/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm
            #yum install -f   # 修复任何依赖 这个命令有问题注释掉
        fi
    else
        echo "无效的输入。请输入 'y' 或 'n'。"
        exit 1
    fi

    # 检查安装是否成功
    if [ $? -ne 0 ]; then
        echo "$SYSLOG_SERVICE 安装失败。正在退出。"
        exit 1
    fi
fi

# 获取本机IP地址
LOCAL_IP=$(hostname -I | awk '{print $1}')

# 提示用户输入要转发 syslog 到的 IP 地址
read -p "请输入要转发 syslog 到的 IP 地址 [$LOCAL_IP]: " IP_ADDRESS
IP_ADDRESS=${IP_ADDRESS:-$LOCAL_IP}

# 提示用户输入 syslog 转发的协议
read -p "请输入 syslog 转发的协议 (tcp/udp): " PROTOCOL
PROTOCOL=${PROTOCOL:-udp}

# 提示用户输入 syslog 转发协议的端口
read -p "请输入 syslog 转发协议的端口 [514]: " PORT
PORT=${PORT:-514}

# 提示用户输入要记录的本机IP地址
read -p "请输入要记录的本机 IP 地址 [$LOCAL_IP]: " MY_IP
MY_IP=${MY_IP:-$LOCAL_IP}

# 提示用户输入是否开启web日志转发(y/n)
read -p "是否开启web错误日志收集?(y/n): " ENABLE_WEB_LOG_FORWARDING
ENABLE_WEB_LOG_FORWARDING=${ENABLE_WEB_LOG_FORWARDING:-n}

# 提示用户开启哪些类型的日志转发(类型.级别),循环实现,以横线-结束
# 创建一个数组来存储用户选择的日志类型和级别
DEFAULT_LOG_TYPES=("auth.*" "authpriv.*")
LOG_TYPES=("${DEFAULT_LOG_TYPES[@]}")

# 提示用户输入要开启的日志类型和级别,直到输入横线为止
while true; do
    read -p "请输入要开启的日志类型和级别 (类型.级别),或输入 - 结束: " LOG_TYPE
    if [[ $LOG_TYPE == "-" ]]; then
        break
    elif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; then
        echo "$LOG_TYPE 已经包含在默认值中,不需手动添加。"
    else
        LOG_TYPES+=("$LOG_TYPE")
    fi
done

# 打印用户选择的日志类型和级别
echo "您选择了以下日志类型和级别:"
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type"
done


echo "将 syslog 转发到 IP 地址: $IP_ADDRESS,协议: $PROTOCOL,端口: $PORT,本机ip为:$MY_IP,是否开启web日志转发:$ENABLE_WEB_LOG_FORWARDING"

if [[ $ENABLE_WEB_LOG_FORWARDING == "y" ]]; then
    # 将配置写入文件 写入的文件可能不存在 需要新建或者切换地址
    echo "module(load=\"imfile\")" > /etc/rsyslog.d/nginx-error.conf
    echo "# 监控文件变化" >> /etc/rsyslog.d/nginx-error.conf
    echo "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.conf
    echo "    Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.conf
    echo "template(name=\"MyTemplate\" type=\"string\" string=\"$MY_IP: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.conf
    echo ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.conf

    echo "已将 web错误日志转发 配置写入 /etc/rsyslog.d/nginx-error.conf 文件"
else
    echo "未开启 web 日志转发,不写入web错误日志"
    rm -f /etc/rsyslog.d/nginx-error.conf
    echo "已清除/etc/rsyslog.d/nginx-error.conf"
fi


# 将配置写入文件
CONF_FILE="/etc/rsyslog.d/wasb-remote.conf"
echo "" > $CONF_FILE  # 清空文件内容
echo "template(name=\"MyTemplate\" type=\"string\" string=\"$MY_IP: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> $CONF_FILE
for log_type in "${LOG_TYPES[@]}"; do
    echo "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILE
    echo "" >> $CONF_FILE  # 添加空行分隔
done

echo "已将 日志类型.日志级别 配置写入 $CONF_FILE 文件"

# 重启 rsyslog 服务
echo "正在重启 rsyslog 服务..."
systemctl restart rsyslog

# 打印 rsyslog 服务状态
echo "rsyslog 服务状态:"
systemctl status rsyslog