交互式服务器管理工具示例

  • A+
所属分类:Shell

功能:通过菜单交互简化操作

#!/bin/bash
#适用于 CentOS 系统

# 定义颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 显示菜单函数
show_menu() {
    clear
    echo -e "${YELLOW}===== 服务器管理工具 ====${NC}"
    echo "1. 系统信息概览"
    echo "2. 查看内存和CPU使用情况"
    echo "3. 查看磁盘空间"
    echo "4. 清理临时文件"
    echo "5. 重启服务"
    echo "6. 查看日志"
    echo "7. 网络状态检测"
    echo "8. 备份数据库"
    echo "9. 退出"
    echo -n "请选择操作 [1-9]: "
}

# 系统信息概览
system_info() {
    echo -e "${GREEN}===== 系统信息概览 ====${NC}"
    echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2)"
    echo "内核版本: $(uname -r)"
    echo "主机名: $(hostname)"
    echo "当前时间: $(date)"
    echo "运行时间: $(uptime -p)"
    echo "CPU信息: $(lscpu | grep 'Model name' | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')"
    echo "内存总量: $(free -h | grep Mem | awk '{print $2}')"
    echo "磁盘空间: $(df -h / | grep /dev | awk '{print "总量: " $2 ", 已用: " $3 ", 剩余: " $4}')"
    echo "IP地址: $(ip addr | grep inet | grep -v 127.0.0.1 | grep -v inet6 | head -1 | awk '{print $2}')"
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 查看内存和CPU使用情况
memory_cpu() {
    echo -e "${GREEN}===== 内存和CPU使用情况 ====${NC}"
    echo "内存使用情况:"
    free -h
    echo -e "\nCPU使用情况:"
    top -bn1 | grep "Cpu(s)" | awk '{print "CPU使用率: " $2 + $4 "%"}'
    echo -e "\n正在运行的进程:"
    ps aux --sort=-%mem | head -5
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 查看磁盘空间
disk_space() {
    echo -e "${GREEN}===== 磁盘空间使用情况 ====${NC}"
    df -h
    echo -e "\n当前目录下最大的10个文件:"
    find . -type f -exec du -h {} + | sort -rh | head -10
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 清理临时文件
clean_temp() {
    echo -e "${GREEN}===== 清理临时文件 ====${NC}"
    echo -n "确定要清理临时文件吗? (y/n): "
    read confirm
    if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
        echo "正在清理 /tmp 和 /var/tmp 目录..."
        rm -rf /tmp/* /var/tmp/*
        echo -e "${GREEN}清理完成!${NC}"
    else
        echo "已取消清理"
    fi
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 重启服务
restart_service() {
    echo -e "${GREEN}===== 重启服务 ====${NC}"
    echo "1. Nginx"
    echo "2. Apache"
    echo "3. MySQL/MariaDB"
    echo "4. PostgreSQL"
    echo "5. Redis"
    echo "6. 自定义服务"
    echo "7. 返回主菜单"
    echo -n "请选择要重启的服务 [1-7]: "
    read service_choice
    
    case $service_choice in
        1) service_name="nginx" ;;
        2) service_name="httpd" ;;
        3) service_name="mariadb" ;;
        4) service_name="postgresql" ;;
        5) service_name="redis" ;;
        6) 
            echo -n "请输入服务名称: "
            read service_name
            ;;
        7) return ;;
        *) 
            echo "无效选择,返回主菜单"
            echo -e "${YELLOW}按Enter继续...${NC}"
            read
            return
            ;;
    esac
    
    echo -n "确定要重启 $service_name 服务吗? (y/n): "
    read confirm
    if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
        echo "正在重启 $service_name 服务..."
        systemctl restart $service_name
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}$service_name 服务已成功重启${NC}"
        else
            echo -e "${RED}重启 $service_name 服务失败,请检查日志${NC}"
        fi
    else
        echo "已取消重启"
    fi
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 查看日志
view_logs() {
    echo -e "${GREEN}===== 查看日志 ====${NC}"
    echo "1. 系统日志 (/var/log/messages)"
    echo "2. Nginx 访问日志"
    echo "3. Nginx 错误日志"
    echo "4. MySQL/MariaDB 日志"
    echo "5. PostgreSQL 日志"
    echo "6. 自定义日志文件"
    echo "7. 返回主菜单"
    echo -n "请选择要查看的日志 [1-7]: "
    read log_choice
    
    case $log_choice in
        1) log_file="/var/log/messages" ;;
        2) log_file="/var/log/nginx/access.log" ;;
        3) log_file="/var/log/nginx/error.log" ;;
        4) log_file="/var/log/mariadb/mariadb.log" ;;
        5) log_file="/var/lib/pgsql/data/pg_log/postgresql-$(date +%Y-%m-%d).log" ;;
        6) 
            echo -n "请输入日志文件路径: "
            read log_file
            ;;
        7) return ;;
        *) 
            echo "无效选择,返回主菜单"
            echo -e "${YELLOW}按Enter继续...${NC}"
            read
            return
            ;;
    esac
    
    if [ -f "$log_file" ]; then
        echo "正在查看 $log_file 的最新50行..."
        tail -n 50 "$log_file"
    else
        echo -e "${RED}日志文件 $log_file 不存在${NC}"
    fi
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 网络状态检测
network_status() {
    echo -e "${GREEN}===== 网络状态检测 ====${NC}"
    echo "正在检测网络连接..."
    echo "本地IP: $(hostname -I)"
    echo "网关: $(ip route | grep default | awk '{print $3}')"
    
    echo -e "\n测试DNS解析:"
    ping -c 2 google.com &> /dev/null
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}DNS解析正常${NC}"
    else
        echo -e "${RED}DNS解析失败${NC}"
    fi
    
    echo -e "\n测试外网连接:"
    curl -s --head --request GET https://www.baidu.com | grep "200 OK" &> /dev/null
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}外网连接正常${NC}"
    else
        echo -e "${RED}外网连接失败${NC}"
    fi
    
    echo -e "\n开放的TCP端口:"
    netstat -tuln | grep LISTEN
    
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 备份数据库
backup_database() {
    echo -e "${GREEN}===== 备份数据库 ====${NC}"
    echo "1. MySQL/MariaDB"
    echo "2. PostgreSQL"
    echo "3. 返回主菜单"
    echo -n "请选择要备份的数据库类型 [1-3]: "
    read db_choice
    
    case $db_choice in
        1)
            echo -n "输入数据库用户名: "
            read db_user
            echo -n "输入数据库密码: "
            read -s db_password
            echo
            echo -n "输入要备份的数据库名: "
            read db_name
            echo -n "输入备份文件保存路径: "
            read backup_path
            
            if [ ! -d "$backup_path" ]; then
                mkdir -p "$backup_path"
            fi
            
            backup_file="$backup_path/${db_name}_$(date +%Y%m%d_%H%M%S).sql"
            
            echo "正在备份 $db_name 数据库..."
            mysqldump -u "$db_user" -p"$db_password" "$db_name" > "$backup_file"
            
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}备份成功: $backup_file${NC}"
                echo "正在压缩备份文件..."
                gzip "$backup_file"
                echo -e "${GREEN}压缩完成: $backup_file.gz${NC}"
            else
                echo -e "${RED}备份失败,请检查数据库连接信息${NC}"
            fi
            ;;
        2)
            echo -n "输入数据库用户名: "
            read db_user
            echo -n "输入数据库密码: "
            read -s db_password
            echo
            echo -n "输入要备份的数据库名: "
            read db_name
            echo -n "输入备份文件保存路径: "
            read backup_path
            
            if [ ! -d "$backup_path" ]; then
                mkdir -p "$backup_path"
            fi
            
            backup_file="$backup_path/${db_name}_$(date +%Y%m%d_%H%M%S).sql"
            
            echo "正在备份 $db_name 数据库..."
            PGPASSWORD="$db_password" pg_dump -U "$db_user" "$db_name" > "$backup_file"
            
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}备份成功: $backup_file${NC}"
                echo "正在压缩备份文件..."
                gzip "$backup_file"
                echo -e "${GREEN}压缩完成: $backup_file.gz${NC}"
            else
                echo -e "${RED}备份失败,请检查数据库连接信息${NC}"
            fi
            ;;
        3) return ;;
        *) 
            echo "无效选择,返回主菜单"
            ;;
    esac
    
    echo -e "${YELLOW}按Enter继续...${NC}"
    read
}

# 主程序
while true; do
    show_menu
    read choice
    
    case $choice in
        1) system_info ;;
        2) memory_cpu ;;
        3) disk_space ;;
        4) clean_temp ;;
        5) restart_service ;;
        6) view_logs ;;
        7) network_status ;;
        8) backup_database ;;
        9) 
            echo -e "${GREEN}感谢使用服务器管理工具,再见!${NC}"
            exit 0 
            ;;
        *) 
            echo -e "${RED}无效选择,请重试${NC}"
            sleep 1
            ;;
    esac
done
交互式服务器管理工具示例
xxx