Simulate Linux file administrator system - shell implementation

Simulate Linux file administrator system - shell implementation

Note: This script is only for learning and needs to be adjusted according to the actual situation.

1 System Requirements

insert image description here

2 script execution effect

2.1 Administrator login effect

insert image description here

2.2 Common user login effect

insert image description here

2.3 Password file format

Separated by spaces, from left to right:
whether the user name and password are administrators (1 is an administrator, 0 is a normal user), whether they are locked (1 is locked, 0 is unlocked)

insert image description here

3 Implement the script

[root@waluna ~]# cat Log_in.sh
#!/bin/bash
#
#**************************************************
#Author:                Xan_Yum
#QQ:                    7993167
#Email:                 [email protected]
#Version:               1.0
#Date:                  2022-06-12
#FileName:              Log_in.sh
#Description:           The test script
#URL:                   https://waluna.top
#Copyroght (C):         2022 ALL rights reserved
#**************************************************

############################## 函数区 ###############################

# 参数获取
ARGS(){
    
    
    USER_PASSWD=`grep -E "^${
      
      USER} " auth.pass`
    USERR=`echo $USER_PASSWD | cut -d' ' -f1`
    PASSWDR=`echo $USER_PASSWD | cut -d' ' -f2`
    ADMIN=`echo $USER_PASSWD | cut -d' ' -f3`
    LOCK=`echo $USER_PASSWD | cut -d' ' -f4`
}

# 创建新用户
NEW_USER(){
    
    
    read -p "请输入要创建的用户名:" USER
    ARGS
    if [ -n "$USERR" ];then
        echo "用户已存在"
        if [ -d $USER ];then
            echo "${
     
     USER} `date +%F_%T`" > ${
    
    USER}/${
    
    USER}.log
        else
            mkdir $USER
            echo "${
     
     USER} `date +%F_%T`" > ${
    
    USER}/${
    
    USER}.log
        fi
    else
        read -sp "请输入新用户的密码:" PASSWD
        echo "${
     
     USER} ${PASSWD} 0 0" >> auth.pass
        if [ -d $USER ];then
            echo "${
     
     USER} `date +%F_%T`" > ${
    
    USER}/${
    
    USER}.log
        else
            mkdir $USER
            echo "${
     
     USER} `date +%F_%T`" > ${
    
    USER}/${
    
    USER}.log
        fi
        echo "${
     
     USER}用户创建完成"
    fi
}

# 删除旧用户
DEL_USER(){
    
    
    read -p "请输入要删除的用户名:" USER
    ARGS
    if [ -n "$USERR" ];then
        sed -ri.bak "/^${
     
     USER}/d" auth.pass
        rm -rf ${
    
    USER}
        echo "${
     
     USER}用户已删除"
    else
        echo "${
     
     USER}用户不存在"
    fi
}

# 解锁用户
UNLOCK_USER(){
    
    
    read -p "请输入要解锁的用户名:" USER
    ARGS
    if [ -n "$USERR" ];then
        if [ ${LOCK} -eq 1 ];then
            sed -ri.bak "s/^(${USERR}.* )1$/\10/" auth.pass
            echo "${USERR}用户已解锁"
        else
            echo "${USERR}用户没有被锁定"
        fi
    else
        echo "您输入的用户名不存在"
    fi
}

# 权限管理
PRI_MAN(){
    
    
    read -p "请输入要设置权限的用户名:" USER
    ARGS
    if [ -z "${
     
     USER}" ];then
        echo "用户名不能为空!"
    elif [ "${
     
     USER}" = "admin" ];then
        echo "admin用户不允许更改"
    elif [ -n "$USERR" ];then
        read -p "请输入要设置的权限(0为普通用户,1为管理员):" PRI
        if [ -z "$PRI" ];then
            echo "请输入 0|1 "
        elif [ ${PRI} -eq 0 ];then
            sed -ri.bak "s/^(${USERR}.*) . (.)$/\1 0 \2/" auth.pass
            echo "已将${USERR}用户设置为普通用户"
        elif [ ${PRI} -eq 1 ];then
            sed -ri.bak "s/^(${USERR}.*) . (.)$/\1 1 \2/" auth.pass
            echo "已将${USERR}用户设置为管理员用户"
        else
            echo "请输入 0|1 "
        fi
    else
        echo "您输入的用户名不存在"
    fi
}

# 管理员菜单
ADMIN_MENU(){
    
    
    # 这里使用select循环,导致实现功能后不会自动打印菜单,需要回车后才能显示。
    PS3="请输入(1-5,直接回车会重新打印菜单):"
    select MENU in 创建新用户 删除旧用户 解锁用户 权限管理 退出;do
    case $REPLY in
    1)
        NEW_USER
        ;;
    2)
        DEL_USER
        ;;
    3)
        UNLOCK_USER
        ;;
    4)
        PRI_MAN
        ;;
    5)
        exit
        ;;
    *)
        echo "输入错误,请重新输入!"
        ;;
    esac
    done
}

# 新建文本文件
NEW_FILE(){
    
    
    read -p "请输入要创建的文件名:" FILENAME
    if [ -z ${FILENAME} ];then
        echo "文件名不能为空!"
    elif [ -d ${FILENAME} ];then
        echo "${FILENAME}是一个目录"
        if [ -f ${FILENAME}/${FILENAME} ];then
            echo "文件已存在!"
        else
            touch ${FILENAME}/${FILENAME}
            echo "${FILENAME}/${FILENAME}文本文件创建完成"
        fi
    elif [ -f ${FILENAME} ];then
        echo "文件已存在!"
    else
        touch ${FILENAME}
        echo "${FILENAME}文本文件创建完成"
    fi
}

# 新建目录
NEW_DIR(){
    
    
    read -p "请输入要创建的目录名:" DIRNAME
    if [ -z ${DIRNAME} ];then
        echo "目录名不能为空!"
    elif [ -d ${DIRNAME} ];then
        echo "目录已存在!"
    else
        mkdir ${DIRNAME}
        echo "${DIRNAME}目录创建完成"
    fi
}

# 统计文档信息
ARCHIVE_FILE(){
    
    
    read -p "请输入要统计的文件名:" FILENAME
    if [ -z ${FILENAME} ];then
        echo "文件名不能为空!"
    elif [ -f ${FILENAME} ];then
        echo "${FILENAME}文件的行数为`wc -l ${
      
      FILENAME}|cut -d' ' -f1`"
        echo "${FILENAME}文件的单词数为`wc -w ${
      
      FILENAME}|cut -d' ' -f1`"
        echo "${FILENAME}文件的字符数为`wc -c ${
      
      FILENAME}|cut -d' ' -f1`"
    else
        echo "${FILENAME}文件不存在"
    fi
}

# 权限查看
PRI_VIEW(){
    
    
    read -p "请输入要查看的文件名:" FILENAME
    if [ -z ${FILENAME} ];then
        echo "文件名不能为空!"
    elif [ -f ${FILENAME} ];then
        if [ -r ${FILENAME} -a -w ${FILENAME} -a -x ${FILENAME} ];then
            echo "Readable & Writeable & Executable"
        elif [ -r ${FILENAME} -a -x ${FILENAME} ];then
            echo "Readable & Executable"
        else
            echo "其他权限"
        fi
    else
        echo "${FILENAME}文件不存在"
    fi
}

# 普通用户菜单
USER_MENU(){
    
    
    PS3="请输入(1-5,直接回车会重新打印菜单):"
    select MENU in 新建文本文件 新建目录 统计文档信息 权限查看 退出;do
    case $REPLY in
    1)
        NEW_FILE
        ;;
    2)
        NEW_DIR
        ;;
    3)
        ARCHIVE_FILE
        ;;
    4)
        PRI_VIEW
        ;;
    5)
        exit
        ;;
    *)
        echo "输入错误,请重新输入!"
        ;;
    esac
    done
}

# 判断是否为管理员
ADMIN_JUDGE(){
    
    
    if [ ${ADMIN} -eq 1 ];then
        echo "当前角色为管理员"
        ADMIN_MENU
    elif [ ${ADMIN} -eq 0 ];then
        echo "当前角色为普通用户"
        USER_MENU
    fi
}

# 判断用户密码是否正确
PASSWD_JUDGE(){
    
    
    if [ "${PASSWD}" = "${PASSWDR}" ];then
        echo "登录成功!!!"
        ADMIN_JUDGE
    else
        echo "密码或用户名错误"
    fi
}

# 判断用户账号是否锁定
LOCK_JUDGE(){
    
    
    if [ ${LOCK} -eq 1 ];then
        echo "${
     
     USER}用户已被锁定,请联系管理员!!!"
        exit 1
    elif [ ${LOCK} -eq 0 ];then
        #echo "${USER}用户可以正常登录"
        PASSWD_JUDGE
    fi
}

# 判断用户是否存在
EXIST_JUDGE(){
    
    
    if [ -z ${USERR} ];then
        echo "用户不存在,请先创建用户!"
        exit 1
    else
        LOCK_JUDGE
    fi
}

# 密码数错三次后锁定账号
LOCK_USER(){
    
    
    if [ "$USERR" = "admin" ];then
        sed -ri.bak "s/^(${USERR}.* )0$/\11/" auth.pass
        echo "已锁定!!!"
        chmod 0 Log_in.sh
    else
        sed -ri.bak "s/^(${USERR}.* )0$/\11/" auth.pass
        echo "${USERR}用户已被锁定,请联系管理员!!!"
    fi
}



############################## 功能区 ###############################

i=0

read -p "请输入登录名:" USER

while ((i<3));do
    read -sp "请输入密码:" PASSWD
    echo

    if [ -z $USER ];then
        echo "请输入登录名!"
        exit 1
    fi

    if [ -z $PASSWD ];then
        echo "请输入密码!"
        exit 1
    fi

    ARGS
    EXIST_JUDGE

    let i++
done

LOCK_USER

[root@waluna ~]# 

4 password file

[root@waluna ~]# cat auth.pass
admin 123456 1 0
waluna waluna 0 0
[root@waluna ~]# 

5 Description

There are still some problems with this script. For example, if the password file is not created in advance, it will result in failure to log in and an error will be reported; the menu is implemented using select, and the format cannot be customized. You can modify the script by yourself to achieve more complete functions.

Original link: Simulate Linux file administrator system - shell implementation .

Guess you like

Origin blog.csdn.net/qq_45520116/article/details/125948343