关于shell:模拟Linux文件管理员系统shell实现

8次阅读

共计 4603 个字符,预计需要花费 12 分钟才能阅读完成。

模仿 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=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 密码文件

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

5 阐明

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


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


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

正文完
 0