本文目录导读:

我来给你一个完善的逐项检测运行环境的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
使用方法
-
保存为文件
vim check_env.sh
-
添加执行权限
chmod +x check_env.sh
-
运行脚本
./check_env.sh
-
或直接下载运行
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
这个脚本模块化、可扩展,你可以根据项目需求添加或删除检测项。