腳本分解
環境檢測部分
檢查操作系統
#!/bin/bash# 檢查是否為 Debian 類型
if [ -f /etc/debian_version ]; thenecho "當前操作系統是 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"
elseecho "不支持的 Linux 發行版。"exit 1
fi
檢查是否存在rsyslog
# 步驟 2:檢查 syslog 是否安裝
if ! command -v $SYSLOG_SERVICE &> /dev/null && ! systemctl status rsyslog.service &> /dev/null; thenecho "$SYSLOG_SERVICE 未安裝。正在安裝..."# 交互式詢問是否有互聯網連接read -p "是否有互聯網連接?(y/n): " INTERNET_CONNECTIONif [[ $INTERNET_CONNECTION == "y" ]]; then# 從互聯網倉庫安裝$INSTALL_COMMAND $SYSLOG_SERVICEelif [[ $INTERNET_CONNECTION == "n" ]]; then# 從本地軟件包安裝if [[ $ID == "debian" || $ID == "ubuntu" ]]; thenecho "正在使用本地 rsyslog 軟件包安裝..."dpkg -i /path/to/local/rsyslog/package.debapt-get install -f # 修復任何依賴elif [[ $ID == "centos" || $ID == "rhel" ]]; thenecho "正在使用本地 rsyslog 軟件包安裝..."rpm -ivh /path/to/local/rsyslog/package.rpmyum install -f # 修復任何依賴fielseecho "無效的輸入。請輸入 'y' 或 'n'。"exit 1fi# 檢查安裝是否成功if [ $? -ne 0 ]; thenecho "$SYSLOG_SERVICE 安裝失敗。正在退出。"exit 1fi
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; doread -p "請輸入要開啟的日志類型和級別 (類型.級別),或輸入 - 結束: " LOG_TYPEif [[ $LOG_TYPE == "-" ]]; thenbreakelif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; thenecho "$LOG_TYPE 已經包含在默認值中,不需手動添加。"elseLOG_TYPES+=("$LOG_TYPE")fi
done# 打印用戶選擇的日志類型和級別
echo "您選擇了以下日志類型和級別:"
for log_type in "${LOG_TYPES[@]}"; doecho "$log_type"
doneecho "將 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.confecho "# 監控文件變化" >> /etc/rsyslog.d/nginx-error.confecho "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.confecho " File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.confecho " Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.confecho "template(name=\"MyTemplate\" type=\"string\" string=\"%$LOCAL_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.confecho ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.confecho "已將 web錯誤日志轉發 配置寫入 /etc/rsyslog.d/nginx-error.conf 文件"
elseecho "未開啟 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[@]}"; doecho "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILEecho "" >> $CONF_FILE # 添加空行分隔
doneecho "已將配置寫入 $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; doread -p "請輸入要開啟的日志類型和級別 (類型.級別),或輸入 - 結束: " LOG_TYPEif [[ $LOG_TYPE == "-" ]]; thenbreakelif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; thenecho "$LOG_TYPE 已經包含在默認值中,不需手動添加。"elseLOG_TYPES+=("$LOG_TYPE")fi
done# 打印用戶選擇的日志類型和級別
echo "您選擇了以下日志類型和級別:"
for log_type in "${LOG_TYPES[@]}"; doecho "$log_type"
doneecho "將 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.confecho "# 監控文件變化" >> /etc/rsyslog.d/nginx-error.confecho "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.confecho " File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.confecho " Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.confecho "template(name=\"MyTemplate\" type=\"string\" string=\"%$LOCAL_IP%: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.confecho ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.confecho "已將 web錯誤日志轉發 配置寫入 /etc/rsyslog.d/nginx-error.conf 文件"
elseecho "未開啟 web 日志轉發,不寫入web錯誤日志"
fitemplate(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[@]}"; doecho "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILEecho "" >> $CONF_FILE # 添加空行分隔
doneecho "已將 日志類型.日志級別 配置寫入 $CONF_FILE 文件"
包含環境檢查的一鍵腳本
#!/bin/bash
# 檢查是否為 Debian 類型
if [ -f /etc/debian_version ]; thenecho "當前操作系統是 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"
elseecho "不支持的 Linux 發行版。"exit 1
fi# 步驟 2:檢查 syslog 是否安裝
if ! command -v $SYSLOG_SERVICE &> /dev/null && ! systemctl status rsyslog.service &> /dev/null; thenecho "$SYSLOG_SERVICE 未安裝。正在安裝..."# 交互式詢問是否有互聯網連接read -p "是否有互聯網連接?(y/n): " INTERNET_CONNECTION#防止找不到pathexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binif [[ $INTERNET_CONNECTION == "y" ]]; then# 從互聯網倉庫安裝$INSTALL_COMMAND $SYSLOG_SERVICEelif [[ $INTERNET_CONNECTION == "n" ]]; then# 從本地軟件包安裝if [ -f /etc/debian_version ]; thenecho "正在使用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.debdpkg -i /path/to/local/rsyslog/rsyslog_8.2302.0-1_amd64.debapt-get install -f # 修復任何依賴elif [ -f /etc/redhat-release ]; thenecho "正在使用本地 rsyslog 軟件包安裝..."# todo 待補充#根據實際的上傳路徑文件包名修改rpm -ivh /path/to/local/rsyslog/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm#yum install -f # 修復任何依賴 這個命令有問題注釋掉fielseecho "無效的輸入。請輸入 'y' 或 'n'。"exit 1fi# 檢查安裝是否成功if [ $? -ne 0 ]; thenecho "$SYSLOG_SERVICE 安裝失敗。正在退出。"exit 1fi
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; doread -p "請輸入要開啟的日志類型和級別 (類型.級別),或輸入 - 結束: " LOG_TYPEif [[ $LOG_TYPE == "-" ]]; thenbreakelif [[ " ${LOG_TYPES[@]} " =~ " $LOG_TYPE " ]]; thenecho "$LOG_TYPE 已經包含在默認值中,不需手動添加。"elseLOG_TYPES+=("$LOG_TYPE")fi
done# 打印用戶選擇的日志類型和級別
echo "您選擇了以下日志類型和級別:"
for log_type in "${LOG_TYPES[@]}"; doecho "$log_type"
doneecho "將 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.confecho "# 監控文件變化" >> /etc/rsyslog.d/nginx-error.confecho "input(type=\"imfile\"" >> /etc/rsyslog.d/nginx-error.confecho " File=\"/var/log/nginx/error.log\"" >> /etc/rsyslog.d/nginx-error.confecho " Tag=\"NGINXERROR\")" >> /etc/rsyslog.d/nginx-error.confecho "template(name=\"MyTemplate\" type=\"string\" string=\"$MY_IP: %timestamp% %hostname% %syslogtag% %msg%\\n\")" >> /etc/rsyslog.d/nginx-error.confecho ":syslogtag, isequal, \"NGINXERROR\" @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> /etc/rsyslog.d/nginx-error.confecho "已將 web錯誤日志轉發 配置寫入 /etc/rsyslog.d/nginx-error.conf 文件"
elseecho "未開啟 web 日志轉發,不寫入web錯誤日志"rm -f /etc/rsyslog.d/nginx-error.confecho "已清除/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[@]}"; doecho "$log_type @$IP_ADDRESS:$PORT/$PROTOCOL;MyTemplate" >> $CONF_FILEecho "" >> $CONF_FILE # 添加空行分隔
doneecho "已將 日志類型.日志級別 配置寫入 $CONF_FILE 文件"# 重啟 rsyslog 服務
echo "正在重啟 rsyslog 服務..."
systemctl restart rsyslog# 打印 rsyslog 服務狀態
echo "rsyslog 服務狀態:"
systemctl status rsyslog