模仿Linux文件管理员零碎-shell实现

注:此脚本仅供学习应用,具体须要依据理论状况进行测试调整。

1 零碎要求

2 脚本执行成果

2.1 管理员登录成果

2.2 普通用户登录成果

2.3 明码文件格式

用空格隔开,从左往右顺次为:
用户名 明码 是否为管理员(1为管理员0为普通用户) 是否被锁定(1被锁定0为解锁)

3 实现脚本

[root@waluna ~]# cat Log_in.sh#!/bin/bash##**************************************************#Author:                Xan_Yum#QQ:                    7993167#Email:                 waluna@qq.com#Version:               1.0#Date:                  2022-06-12#FileName:              Log_in.sh#Description:           The test script#URL:                   https://blog.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=0read -p "请输出登录名:" USERwhile ((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++doneLOCK_USER[root@waluna ~]# 

4 密码文件

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

5 阐明

此脚本还存在一些问题,比方密码文件不提前创立会导致无奈登录而报错;菜单应用select实现,不能自定义格局等。大家能够自行批改脚本,实现更残缺的性能。


对于我
全网可搜《阿贤Linux》
CSDN、知乎、哔哩哔哩、博客园、51CTO、开源中国、掘金、思否、阿里云、腾讯云、华为云、今日头条、GitHub、集体博客
公众号:阿贤Linux
集体博客:blog.waluna.top
https://blog.waluna.top/

原文链接: 模仿Linux文件管理员零碎-shell实现.