实验环境
操作系统:Centos 7.9
Mysql版本:8.0.30
Mysql账号:root
Mysql密码:1qaz@WSX
创建 MySQL 数据库和表
在 MySQL 中创建一个数据库和用户表:
CREATE DATABASE user_management;
USE user_management;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);
Shell 脚本
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="1qaz@WSX"
MYSQL_DB="user_management"
function register_user() {
read -p "请输入用户名: " reg_username
read -sp "请输入密码: " reg_password
echo
# 检查用户名是否已存在
user_exists=$(mysql -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -se "SELECT COUNT(*) FROM users WHERE username='$reg_username';")
if [ "$user_exists" -ne 0 ]; then
echo "用户名已存在。请选择其他用户名。"
return 1
fi
# 将新用户插入到数据库中
mysql -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e "INSERT INTO users (username, password) VALUES ('$reg_username', '$reg_password');"
if [ $? -eq 0 ]; then
echo "用户注册成功!"
else
echo "用户注册失败。"
fi
}
function authenticate_user() {
read -sp "请输入密码: " inp_password
echo
# 从数据库中获取密码
stored_password=$(mysql -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -se "SELECT password FROM users WHERE username='$inp_username';")
if [ -z "$stored_password" ]; then
echo "认证失败:用户名不存在。"
return 1
fi
if [ "$stored_password" = "$inp_password" ]; then
echo "登录成功!欢迎进入主页。"
return 0
else
echo "认证失败:密码错误。"
return 1
fi
}
function lock_test() {
for line in `cat lock.txt`
do
lock_user=$(echo $line | cut -d: -f1)
lock_time=$(echo $line | cut -d: -f2)
if [ "$inp_username" = "$lock_user" ]; then
# 判断锁定的时间,如果超过60秒,解锁,否则继续锁定
current_time=$(date '+%s')
period=$((current_time - lock_time))
if [ $period -le 60 ]; then
# 处于锁定周期内
echo "用户处于锁定状态。。。"
return 1
else
# 应该解锁,继续进行后续认证环节
sed -ri "/^\b($inp_username)\b/d" lock.txt
lock_user_info[$inp_username]=0
return 0
fi
fi
done
}
declare -A lock_user_info
while true
do
echo "1. 注册"
echo "2. 登录"
echo "3. 退出"
read -p "请选择一个选项: " option
case $option in
1)
register_user
;;
2)
read -p "请输入用户名: " inp_username
lock_test
if [ $? -ne 0 ]; then
echo "==============================="
continue
fi
authenticate_user
if [ $? -eq 0 ]; then
break
fi
let lock_user_info[$inp_username]++
;;
3)
echo "再见!"
exit 0
;;
*)
echo "无效选项。请重试。"
;;
esac
declare -A | grep lock_user_info
for k in ${!lock_user_info[@]};
do
username=$k
grep -q "^\b$username\b" lock.txt
if [ $? -eq 0 ]; then
continue
fi
error_times=${lock_user_info[$k]}
if [ $error_times -ge 3 ]; then
echo "尝试次数过多,锁定用户!"
echo "$username:$(date '+%s')" >> lock.txt
fi
done
done
详细说明
- 用户注册功能 (
register_user
函数):
- 提示用户输入用户名和密码。
- 检查用户名是否已存在。
- 如果用户名不存在,则将用户名和密码插入到 MySQL 数据库的
users
表中。
- 用户认证功能 (
authenticate_user
函数):
- 提示用户输入用户名和密码。
- 从数据库中获取该用户名的密码。
- 比较输入的密码和数据库中存储的密码,如果匹配则认证成功,否则认证失败。
- 锁定测试功能 (
lock_test
函数):
- 检查用户是否在锁定状态。
- 如果用户在
lock.txt
文件中被锁定,并且锁定时间未超过 60 秒,则提示用户被锁定。 - 如果锁定时间超过 60 秒,则从
lock.txt
文件中删除该用户,并允许继续进行登录。
- 主循环:
- 提供一个简单的菜单,用户可以选择注册、登录或退出。
- 登录功能集成了锁定功能,如果用户尝试次数过多,则锁定用户 60 秒。