285 lines
7.9 KiB
Bash
285 lines
7.9 KiB
Bash
#!/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
|
|
}
|
|
|
|
|