前言
最近在搭建,经过一段时间,对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 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。