实验:用shell和mysql编写一个用户认证程序

实验环境

操作系统: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

详细说明

  1. 用户注册功能 (register_user 函数)
  • 提示用户输入用户名和密码。
  • 检查用户名是否已存在。
  • 如果用户名不存在,则将用户名和密码插入到 MySQL 数据库的 users 表中。
  1. 用户认证功能 (authenticate_user 函数)
  • 提示用户输入用户名和密码。
  • 从数据库中获取该用户名的密码。
  • 比较输入的密码和数据库中存储的密码,如果匹配则认证成功,否则认证失败。
  1. 锁定测试功能 (lock_test 函数)
  • 检查用户是否在锁定状态。
  • 如果用户在 lock.txt 文件中被锁定,并且锁定时间未超过 60 秒,则提示用户被锁定。
  • 如果锁定时间超过 60 秒,则从 lock.txt 文件中删除该用户,并允许继续进行登录。
  1. 主循环
  • 提供一个简单的菜单,用户可以选择注册、登录或退出。
  • 登录功能集成了锁定功能,如果用户尝试次数过多,则锁定用户 60 秒。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇