#!/bin/bash ############################################################################################# # 用途: 提供一些常用的函数,拱其他脚本调用 # 作者: 丁辉 # 编写时间: 2023-11-27 ############################################################################################# # 加载检测脚本 # source <(curl -sS https://gitee.com/offends/Shell/raw/main/Check_command.sh) # 定义颜色 RED='\033[0;31m' NC='\033[0m' GREEN='\033[32m' YELLOW='\033[33m' # 定义时间格式 TIME="+%Y-%m-%d %H:%M:%S" # 定义函数 send_info function SEND_INFO() { info=$1 echo -e "${GREEN}$(date "$TIME") INFO: $info${NC}" } # 定义函数 send_warn function SEND_WARN() { warn=$1 echo -e "${YELLOW}$(date "$TIME") WARN: $warn${NC}" } # 定义函数 send_error function SEND_ERROR() { error=$1 echo -e "${RED}$(date "$TIME") ERROR: $error${NC}" } # print输出绿色字体 function GREEN_PRINTF() { info=$1 printf "${GREEN}$(date "$TIME") INFO: $info${NC}\n" } # 打印系统信息 function FUNC_PRINT_SYSTEM_INFO() { # 获取系统信息 CENTOS_VERSION=$(cat /etc/os-release | grep PRETTY_NAME= | awk -F '"' '{print $2}') KERNEL_VERSION=$(uname -a | awk '{print $3}') CPU_MODEl=$(cat /proc/cpuinfo | grep 'model name' | head -1 | awk -F ':' '{print $2}' | sed 's#^[ \t]*##g') CPU_CORE=$(grep -c "processor" /proc/cpuinfo) MEMORY_SIZE=$(free -h | awk '/Mem/ {print $2}') # 打印系统信息 SEND_INFO "欢迎使用阿辉的脚本" SEND_INFO "当前系统信息如下: " SEND_INFO "==========================================================" SEND_INFO "服务器架构: $(arch)" SEND_INFO "系统版本: ${CENTOS_VERSION}" SEND_INFO "内核版本: ${KERNEL_VERSION}" SEND_INFO "内存大小: ${MEMORY_SIZE}" SEND_INFO "处理器核数: ${CPU_CORE}" SEND_INFO "处理器型号: ${CPU_MODEl}" SEND_INFO "==========================================================" } # 检查服务器系统版本 function CHECK_OS() { FWQ_NAME=$(cat /etc/os-release | grep '^NAME' | awk -F '"' '{print $2}') if [[ $FWQ_NAME == "CentOS Linux" ]] || [[ $FWQ_NAME == "CentOS Stream" ]];then OS=centos OS_VERSION=$(cat /etc/os-release | grep -oP 'VERSION_ID="\K[^"]+' | cut -d '.' -f 1) elif [[ $FWQ_NAME == "Debian GNU/Linux" ]];then OS=debian OS_VERSION=$(cat /etc/issue | awk -F ' ' '{print $3}') elif [[ $FWQ_NAME == "Ubuntu" ]];then OS=ubuntu OS_VERSION=$(cat /etc/os-release | grep VERSION_ID= | grep -oE '[0-9]+\.[0-9]+' | cut -d'.' -f1) else SEND_ERROR "无法识别的系统版本" exit 1 fi } # 判断服务器架构 function CHECK_CPU() { if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then ARCH_TYPE_1=x86_64 ARCH_TYPE_2=amd64 elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then ARCH_TYPE_1=aarch64 ARCH_TYPE_2=arm64 elif [ $(arch) = "i386" ]; then ARCH_TYPE=x86_64 ARCH_TYPE_2=amd64 else SEND_ERROR "无法识别的系统架构: $(arch)" exit 1 fi } # 启动内核更新脚本 function CHECK_CORE(){ # 询问是否需要升级内核 read -p "是否需要升级内核 [Y/n]" is_core case $is_core in [yY][eE][sS]|[yY]) curl -sLO https://gitee.com/offends/Offends/raw/main/Shell/Core.sh chmod +x Core.sh ./Core.sh $@ ;; [nN][oO]|[nN]) SEND_INFO "跳过内核更新" ;; "") SEND_ERROR "值不能为空,请重新输入" ;; *) SEND_ERROR "输入错误,请重新输入" CHECK_CORE ;; esac } # 检查服务器网络连接 function CHECK_NETWORK() { SEND_INFO "正在检查网络连接" PING=$(ping -c 3 www.baidu.com | grep 'icmp_seq' | wc -l) if [[ ${PING} -eq 0 ]];then SEND_ERROR "网络连接失败,请检查网络连接" exit 1 fi } # 检测文件是否存在 function CHECK_FILE(){ if [ ! -f "$@" ]; then SEND_ERROR "$@ 文件不存在" exit 1 fi } # 检测文件是否存在(多文件情况) function CHECK_FILES(){ shopt -s nullglob for file in "$@"; do if [ ! -f "$file" ]; then SEND_ERROR "$file 文件不存在" exit 1 fi done } # 检测目录是否存在,不存在则创建 function CHECK_DIR(){ if [ ! -d "$@" ]; then mkdir -p "$@" > /dev/null 2>&1 || true fi } # 检测固定位置的二进制文件是否存在 function CHECK_BIN(){ if [ ! -f "$@" ]; then INSTALL_BIN=false fi } # 检测命令是否执行正确,正确则输出$1,错误则输出$2并退出脚本 function CHECK_COMMAND_TRUE() { if [ $? -eq 0 ]; then SEND_INFO "$1" else SEND_ERROR "$2" exit 1 fi } # 判断用户是否存在,不存在则创建 function CHECK_USER(){ if ! id -u "$@" >/dev/null 2>&1; then useradd -m -s /bin/bash --no-user-group "$@" > /dev/null 2>&1 || true fi } # 判断用户组是否存在,不存在则创建 function CHECK_GROUP(){ if ! grep -q "$@" /etc/group; then groupadd "$@" > /dev/null 2>&1 || true fi } # 用户加入组 function ADD_USER_GROUP(){ CHECK_USER "$1" CHECK_GROUP "$2" if ! id -nG "$1" | grep -qw "$2"; then SEND_INFO "正在将用户 $1 加入用户组 $2" usermod -aG "$2" "$1" > /dev/null 2>&1 || true fi id "$1" || true } # 定义输出为空,并且失败不会退出脚本 function NULL_TRUE(){ eval "$*" > /dev/null 2>&1 || true } # 失败不会退出脚本,输出命令执行结果 function NULL_TRUE_ECHO(){ eval "$*" || true } # 检测命令是否执行成功,不输出命令执行结果 function CHECK_COMMAND_NULL() { # 执行传入的命令 eval "$*" > /dev/null 2>&1 # 检查命令执行状态 if [ $? -ne 0 ]; then SEND_ERROR "执行失败, 退出脚本, 请检查命令是否正确: $*" exit 1 fi } # 检测命令是否执行成功,输出命令执行结果 function CHECK_COMMAND_ECHO() { # 执行传入的命令 eval "$*" # 检查命令执行状态 if [ $? -ne 0 ]; then SEND_ERROR "执行失败, 退出脚本, 请检查命令是否正确: $*" exit 1 fi } # 网络安装软件 function CHECK_INSTALL() { # 接收传递给脚本的参数列表 packages=("$@") log_file="/tmp/check_install_log" # 定义日志文件路径 for pkg in "${packages[@]}"; do if command -v yum >/dev/null 2>&1; then SEND_INFO "正在安装 $pkg,请稍后" yum install -y "$pkg" >>"$log_file" 2>&1 if [ $? -ne 0 ]; then SEND_ERROR "安装 $pkg 失败,请查看日志" tail -n 10 "$log_file" # 输出最后10行日志 rm -rf $log_file exit 1 fi elif command -v apt >/dev/null 2>&1; then SEND_INFO "正在安装 $pkg,请稍后" apt-get install -y "$pkg" >>"$log_file" 2>&1 if [ $? -ne 0 ]; then SEND_ERROR "安装 $pkg 失败,请查看日志" tail -n 10 "$log_file" # 输出最后10行日志 rm -rf $log_file exit 1 fi else SEND_ERROR "无法识别的系统软件包管理工具" exit 1 fi done } # 检测某个systemd服务是否存在 function CHECK_SYSTEMD(){ if ! command -v $@ >/dev/null 2>&1; then SEND_ERROR "错误,请检查 $@ 是否安装" exit 1 else SEND_INFO "$@ 服务已安装" if ! systemctl status $@ >/dev/null 2>&1; then SEND_WARN "$@ 服务未启动,正在启动 $@ 服务" if ! systemctl start $@ >/dev/null 2>&1; then SEND_ERROR "$@ 服务启动失败,请检查 $@ 服务" exit 1 fi fi fi }