• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • mysql一键启动脚本(3)

    2025年03月20日 18 阅读 0 评论 5562 字

    前言

    最近在搭建,经过一段时间,对shell有了更深入的了解,解决了原来的mysql登录问题,并且添加了比较简单的密码复杂性检查

    脚本

    #/bin/bash
    #version: v3
    #author: YK
    #update: 安装完毕直接登录,对密码进行检查
    
    
    #网络测试
    ping -c2 223.109.81.112 &>/dev/null    #百度IP
    if [ $? -ne 0 ]; then    #$?代表上一个命令执行结果,0为正确 
      echo "网络不通";
      exit 0;
    else 
      ping -c2 www.baidu.com &>/dev/null
      if [ $? -ne 0 ]; then
        echo "DNS有问题";
        exit 0;
      fi
    fi
    
    #实现有颜色的警告(前景色:31红,32绿,33黄,34蓝,背景色:41红....44蓝)
    echo -e "\033[31m 本脚本会对之前的mysql进行删库,谨慎执行\033[0m"
    
    
    #存放路径
    echo -e "mysql的rpm包存放路径(默认为/usr/local/mysql):\n注意,会清空该目录"
    read rpm_where
    locate=${rpm_locate:-"/usr/local/mysql"}
    if [ ! -d ${locate} ]; then
    #-d 匹配目录是否存在,存在时为true,使用!可以取反
      mkdir -p ${locate} 
    fi
    rm ${locate}/mysql-* -f
    
    groupadd mysql &>/dev/null
    useradd -r -g mysql mysql &>/dev/null
    chown -R mysql:mysql /usr/local/mysql
    chmod -R 755 /usr/local/mysql  
    
    #安装版本
    echo -e "安装mysql5.7?\nyes-->5.7\nno -->8.4 "
    #使用 -e才能解释转义字符,否则类型\n都不会解释
    while true; do
      read -p "请输入 (默认为yes): " version
      version=${version:-"yes"}
      case ${version} in
        [Yy][Ee][Ss])
        #注意选项末尾有个')'
        #此方法无视大小写且简单易实现
          is_mysql57=$(ls ${locate}|grep mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar|wc -l )
          if [ ${is_mysql57} -eq 0 ]; then
            echo "正在下载mysql5.7"
            wget  https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar -P ${locate}  &>/devnull
          fi
          echo "已经下载mysql5.7"
          break
          #此break是对于外循环while的,case本身不需要break
          ;;
        [Nn][Oo])
          is_mysql84=$(ls ${locate}|grep mysql-8.4|grep el7.x86_64.rpm-bundle.tar|wc -l )
          if [ ${is_mysql84} -eq 0 ]; then
            echo "正在下载mysql8.4"
            wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar -P ${locate}  &>/dev/null
          #wget的-P可以指定下载的位置
          fi
          echo "已经下载mysql8.4 "
          break
          ;;
        *)
          echo "请输入yes/no,或使用'ctrl+c'退出"    
          ;;
      esac
    done
    echo "下载完成"
    
    
    
    echo "mysql密码(默认密码为MyStr0ngP@ssw0rd!):"
    read secret_n
    secret_new=${secret_n:-"MyStr0ngP@ssw0rd!"}
    echo "mysql密码:$secret_new"
    
    #密码验证
    check_passwd ${secret_new}
    if [ $? -eq 1 ]; then
      echo "退出安装"
      exit 1
    elif [ $? -eq 0 ]; then
      echo "继续安装"
    fi
    
    
    echo "正在删除旧安装包"
    rpm -qa|grep mysql* |xargs yum remove -y >&/dev/null
    rpm -qa|grep mariadb* |xargs yum remove -y >&/dev/null
    rpm -qa|grep mysql* |xargs rpm -e >&/dev/null
    rm -rf /var/lib/mysql/*
    rm -f /var/log/mysqld.log
    
    
    #安装
    echo "正在安装"
    cd $locate
    yum -y install libaio net-tools openssl-devel perl-Data-Dumper perl-JSON perl-Test-More  >&/dev/null
    tar xf mysql*
    #导入认证密钥
    sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql
    #以下安装包严格按顺序安装
    rpm -ivh ${locate}/mysql-community-client-plugins-*.el7.x86_64.rpm >&/dev/null
    rpm -ivh ${locate}/mysql-community-common-*.el7.x86_64.rpm >&/dev/null
    rpm -ivh ${locate}/mysql-community-libs-*.el7.x86_64.rpm >&/dev/null
    rpm -ivh ${locate}/mysql-community-client-*.el7.x86_64.rpm >&/dev/null
    rpm -ivh ${locate}/mysql-community-icu-data-files-8.4*.el7.x86_64.rpm >&/dev/null
    rpm -ivh ${locate}/mysql-community-devel-*.el7.x86_64.rpm >&/dev/null
    ls mysql-community-client-*.el7.x86_64.rpm |head -1|xargs rpm -ivh >&/dev/null
    rpm -ivh ${locate}/mysql-community-server-*.el7.x86_64.rpm >&/dev/null
    #以下包未安装mysql-community-server-debug-8.4.4-1.el7.x86_64.rpm;mysql-community-test-8.4.4-1.el7.x86_64.rpm;mysql-community-debuginfo-8.4.4-1.el7.x86_64.rpm
    
    
    if [ $? -ne 0 ]; then
      echo "安装失败"
      exit 0
    fi
    #5.7和8.4都有一部分组件没有安装
    
    #启动
    mysql_run=0
    echo "正在启动mysql"
    systemctl daemon-reload
    while [ "$mysql_run" -ne 1 ]
    do
       mysql_run=$(systemctl status mysqld|grep running |wc -l)
       systemctl enable --now  mysqld
       #如果没有,可以手动写service或者直接使用命令启动
       #/usr/local/mysql/bin/mysqld --initialize --user=mysql 
       sleep 10
    done
    
    echo "mysql已启动"
    
    rm ${locate}/mysql-* -f
    #改密码
    secret_old=$(grep 'temporary password' /var/log/mysqld.log|awk  '{print $NF}'| tr -d ';')
    sleep 3
    #自动修改(原本以为passwd两边必须有单引号)
    mysqladmin -u root -p"${secret_old}"  password "${secret_new}"
    echo -e "#--------------------------------\nmysql -uroot -p'${secret_new}'\n#--------------------------------"
    mysql -uroot -p${secret_new}
    
    
    check_passwd(){
      #需要传入password
      local password=$1
      #最小长度
      local min_length=8
      #是否有大写字母
      local has_upper=0
      #是否有小写字母
      local has_lower=0
      #是否有数字
      local has_digit=0
      #是否有特殊字符
      local has_special=0
      #特殊字符数组
      local special_chars='!@#$%^&*()-_=+[]{}|;:,.<>?~'
      # 检查最小长度
      # ${#password}表示${password}的长度
      if [ ${#password} -lt ${min_length} ]; then
          echo "错误:密码长度至少需${min_length}个字符"
          return 1
      fi
     
      # 检查字符类型
      for (( i=0; i<${#password}; i++ )); do
          #${password:$i:1}截取字符串.,每次往后截取一个
          char=${password:$i:1}
          #因为一般的[]无法使用正则,所以升级为[[]]
          if [[ ${char} =~ [A-Z] ]]; then
              has_upper=1
          elif [[ ${char} =~ [a-z] ]]; then
              has_lower=1
          elif [[ ${char} =~ [0-9] ]]; then
              has_digit=1
          elif [[ ${special_chars} =~ $char ]]; then
              has_special=1
          fi
      done
     
      # 验证所有规则
      local errors=()
      [[ ${has_upper} -eq 0 ]] && errors+=("至少包含1个大写字母")
      [[ ${has_lower} -eq 0 ]] && errors+=("至少包含1个小写字母")
      [[ ${has_digit} -eq 0 ]] && errors+=("至少包含1个数字")
      [[ ${has_special} -eq 0 ]] && errors+=("至少包含1个特殊字符")
      #获取数组errors的元素个数,@符号用于表示数组的所有元素
      if [ ${#errors[@]} -gt 0 ]; then
        echo "错误:密码需满足以下要求:"
        printf '• %s\n' "${errors[@]}"
        return 1
      fi
     
      echo "密码验证通过"
      return 0
    }
    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.042 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。