如何写逐项检测运行环境脚本

wen 实用脚本 29

本文目录导读:

如何写逐项检测运行环境脚本

  1. 完整的环境检测脚本
  2. 使用方法
  3. 自定义功能

我来给你一个完善的逐项检测运行环境的Shell脚本模板,包含常见的检测项目:

完整的环境检测脚本

#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 计数器
PASS_COUNT=0
FAIL_COUNT=0
WARN_COUNT=0
print_header() {
    echo -e "\n${BLUE}========================================${NC}"
    echo -e "${BLUE}  环境检测报告 - $(date '+%Y-%m-%d %H:%M:%S')${NC}"
    echo -e "${BLUE}========================================${NC}\n"
}
# 检查命令是否存在
check_command() {
    local cmd=$1
    local name=$2
    echo -n "检测 ${name:-$cmd}... "
    if command -v $cmd &> /dev/null; then
        echo -e "${GREEN}[✓] 已安装${NC}"
        ((PASS_COUNT++))
        return 0
    else
        echo -e "${RED}[✗] 未安装${NC}"
        ((FAIL_COUNT++))
        return 1
    fi
}
# 检查版本
check_version() {
    local cmd=$1
    local version_flag=$2
    local name=$3
    echo -n "检测 ${name:-$cmd} 版本... "
    if $cmd $version_flag 2>/dev/null; then
        echo -e "${GREEN}[✓] 版本检查通过${NC}"
        ((PASS_COUNT++))
    else
        echo -e "${YELLOW}[!] 版本检查失败${NC}"
        ((WARN_COUNT++))
    fi
}
# 检查端口
check_port() {
    local port=$1
    local name=$2
    echo -n "检测端口 ${port} (${name})... "
    if ss -tlnp | grep -q ":$port " || netstat -tlnp 2>/dev/null | grep -q ":$port "; then
        echo -e "${YELLOW}[!] 端口已被占用${NC}"
        ((WARN_COUNT++))
    else
        echo -e "${GREEN}[✓] 端口可用${NC}"
        ((PASS_COUNT++))
    fi
}
# 检查磁盘空间
check_disk() {
    local threshold=${1:-80}
    echo -n "检测磁盘使用率(阈值: ${threshold}%)... "
    local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ "$usage" -gt "$threshold" ]; then
        echo -e "${RED}[✗] 磁盘使用率 ${usage}% > ${threshold}%${NC}"
        ((FAIL_COUNT++))
    else
        echo -e "${GREEN}[✓] 磁盘使用率 ${usage}%${NC}"
        ((PASS_COUNT++))
    fi
}
# 检查系统资源
check_system_resources() {
    echo -e "\n${BLUE}--- 系统资源检查 ---${NC}"
    # CPU 负载
    echo -n "检测 CPU 负载... "
    local load=$(uptime | awk -F'load average:' '{print $2}' | cut -d, -f1)
    if [ $(echo "$load > 2" | bc 2>/dev/null) -eq 1 ]; then
        echo -e "${YELLOW}[!] CPU 负载较高: ${load}${NC}"
        ((WARN_COUNT++))
    else
        echo -e "${GREEN}[✓] CPU 负载正常: ${load}${NC}"
        ((PASS_COUNT++))
    fi
    # 内存使用
    echo -n "检测内存使用... "
    local mem_total=$(free -m | awk 'NR==2 {print $2}')
    local mem_used=$(free -m | awk 'NR==2 {print $3}')
    local mem_percent=$((mem_used * 100 / mem_total))
    if [ "$mem_percent" -gt 90 ]; then
        echo -e "${RED}[✗] 内存使用率 ${mem_percent}%${NC}"
        ((FAIL_COUNT++))
    else
        echo -e "${GREEN}[✓] 内存使用率 ${mem_percent}%${NC}"
        ((PASS_COUNT++))
    fi
}
# 检查各项依赖
check_dependencies() {
    echo -e "\n${BLUE}--- 基础命令检查 ---${NC}"
    local commands=(
        "curl:curl"
        "wget:wget"
        "git:git"
        "python3:Python3"
        "node:Node.js"
        "npm:Node Package Manager"
        "docker:Docker"
        "docker-compose:Docker Compose"
        "nginx:Nginx"
        "mysql:MySQL"
        "redis-cli:Redis"
        "java:Java"
        "mvn:Maven"
        "gcc:GCC"
        "make:Make"
    )
    for cmd_pair in "${commands[@]}"; do
        IFS=':' read -r cmd name <<< "$cmd_pair"
        check_command "$cmd" "$name"
    done
}
# 检查网络连接
check_network() {
    echo -e "\n${BLUE}--- 网络连接检查 ---${NC}"
    local targets=(
        "baidu.com:百度"
        "google.com:谷歌"
        "github.com:GitHub"
        "docker.com:Docker Hub"
    )
    for target in "${targets[@]}"; do
        IFS=':' read -r host name <<< "$target"
        echo -n "检测 ${name} 连接... "
        if curl -s --connect-timeout 5 "$host" > /dev/null 2>&1; then
            echo -e "${GREEN}[✓] 可达${NC}"
            ((PASS_COUNT++))
        else
            echo -e "${YELLOW}[!] 不可达${NC}"
            ((WARN_COUNT++))
        fi
    done
}
# 检查配置文件
check_configs() {
    echo -e "\n${BLUE}--- 配置文件检查 ---${NC}"
    local configs=(
        "/etc/nginx/nginx.conf:Nginx配置"
        "/etc/ssh/sshd_config:SSH配置"
        "/etc/hosts:Hosts文件"
        "/etc/resolv.conf:DNS配置"
    )
    for config in "${configs[@]}"; do
        IFS=':' read -r path name <<< "$config"
        echo -n "检测 ${name} ($path)... "
        if [ -f "$path" ]; then
            echo -e "${GREEN}[✓] 存在${NC}"
            ((PASS_COUNT++))
        else
            echo -e "${YELLOW}[!] 不存在${NC}"
            ((WARN_COUNT++))
        fi
    done
}
# 检查环境变量
check_env_vars() {
    echo -e "\n${BLUE}--- 环境变量检查 ---${NC}"
    local env_vars=(
        "JAVA_HOME:Java Home"
        "M2_HOME:Maven Home"
        "NODE_HOME:Node Home"
        "DOCKER_HOST:Docker Host"
    )
    for env_var in "${env_vars[@]}"; do
        IFS=':' read -r var name <<< "$env_var"
        echo -n "检测 ${name} ($var)... "
        if [ -n "${!var}" ]; then
            echo -e "${GREEN}[✓] 已设置: ${!var}${NC}"
            ((PASS_COUNT++))
        else
            echo -e "${YELLOW}[!] 未设置${NC}"
            ((WARN_COUNT++))
        fi
    done
}
# 检查系统服务
check_services() {
    echo -e "\n${BLUE}--- 系统服务检查 ---${NC}"
    local services=(
        "sshd:SSH服务"
        "docker:Docker服务"
        "nginx:Nginx服务"
        "mysqld:MySQL服务"
    )
    for service in "${services[@]}"; do
        IFS=':' read -r svc name <<< "$service"
        echo -n "检测 ${name}... "
        if systemctl is-active --quiet "$svc" 2>/dev/null; then
            echo -e "${GREEN}[✓] 运行中${NC}"
            ((PASS_COUNT++))
        else
            echo -e "${YELLOW}[!] 未运行${NC}"
            ((WARN_COUNT++))
        fi
    done
}
# 检查安全设置
check_security() {
    echo -e "\n${BLUE}--- 安全检查 ---${NC}"
    # 检查防火墙状态
    echo -n "检测防火墙状态... "
    if ufw status 2>/dev/null | grep -q "active"; then
        echo -e "${GREEN}[✓] 防火墙已启用${NC}"
        ((PASS_COUNT++))
    else
        echo -e "${YELLOW}[!] 防火墙未启用${NC}"
        ((WARN_COUNT++))
    fi
    # 检查 SELinux
    echo -n "检测 SELinux... "
    if getenforce 2>/dev/null | grep -q "Enforcing"; then
        echo -e "${GREEN}[✓] SELinux 已启用${NC}"
        ((PASS_COUNT++))
    elif getenforce 2>/dev/null | grep -q "Permissive"; then
        echo -e "${YELLOW}[!] SELinux 非强制模式${NC}"
        ((WARN_COUNT++))
    else
        echo -e "${YELLOW}[!] SELinux 未安装${NC}"
        ((WARN_COUNT++))
    fi
    # 检查 SSH 配置安全
    echo -n "检测 SSH 根登录... "
    if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config 2>/dev/null; then
        echo -e "${GREEN}[✓] 已禁止根登录${NC}"
        ((PASS_COUNT++))
    else
        echo -e "${YELLOW}[!] 允许根登录${NC}"
        ((WARN_COUNT++))
    fi
}
# 打印总结
print_summary() {
    echo -e "\n${BLUE}========================================${NC}"
    echo -e "${BLUE}  检测总结${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo -e "${GREEN}通过: ${PASS_COUNT}${NC}"
    echo -e "${YELLOW}警告: ${WARN_COUNT}${NC}"
    echo -e "${RED}失败: ${FAIL_COUNT}${NC}"
    echo -e "${BLUE}总分: $((PASS_COUNT + WARN_COUNT + FAIL_COUNT))${NC}"
    if [ $FAIL_COUNT -eq 0 ]; then
        echo -e "\n${GREEN}所有检测通过✓${NC}"
    else
        echo -e "\n${RED}存在 $FAIL_COUNT 项未通过检测✗${NC}"
    fi
}
# 生成JSON报告(可选)
generate_json_report() {
    local report_file="environment_report_$(date '+%Y%m%d_%H%M%S').json"
    cat > "$report_file" << EOF
{
    "report_time": "$(date '+%Y-%m-%d %H:%M:%S')",
    "hostname": "$(hostname)",
    "os": "$(uname -a)",
    "results": {
        "passed": $PASS_COUNT,
        "warnings": $WARN_COUNT,
        "failed": $FAIL_COUNT
    },
    "checks": []
}
EOF
    echo -e "\n${BLUE}JSON报告已生成: $report_file${NC}"
}
# 主函数
main() {
    print_header
    # 检查系统资源
    check_system_resources
    # 检查基础命令
    check_dependencies
    # 检查网络
    check_network
    # 检查配置文件
    check_configs
    # 检查环境变量
    check_env_vars
    # 检查服务
    check_services
    # 检查安全
    check_security
    # 检查端口(示例)
    echo -e "\n${BLUE}--- 端口检查 ---${NC}"
    check_port 80 "HTTP"
    check_port 443 "HTTPS"
    check_port 3306 "MySQL"
    check_port 6379 "Redis"
    # 检查磁盘
    echo -e "\n${BLUE}--- 磁盘检查 ---${NC}"
    check_disk 80
    # 打印总结
    print_summary
    # 可选:生成报告
    # generate_json_report
    # 返回状态码
    exit $FAIL_COUNT
}
# 执行主函数
main

使用方法

  1. 保存为文件

    vim check_env.sh
  2. 添加执行权限

    chmod +x check_env.sh
  3. 运行脚本

    ./check_env.sh
  4. 或直接下载运行

    curl -sL https://your-server/check_env.sh | bash

自定义功能

添加自定义检查

# 在check_dependencies函数中添加
check_command "kubectl" "Kubernetes"
# 或在main函数中添加
echo -n "检测自定义服务... "
# 你的检测逻辑
if [ condition ]; then
    echo -e "${GREEN}[✓] 通过${NC}"
else
    echo -e "${RED}[✗] 失败${NC}"
fi

添加超时控制

# 在检测网络时添加超时
timeout 5 curl -s http://example.com

这个脚本模块化、可扩展,你可以根据项目需求添加或删除检测项。

抱歉,评论功能暂时关闭!