模拟Linux文件管理员系统-shell实现

简介: 模拟Linux文件管理员系统-shell实现

模拟Linux文件管理员系统-shell实现

注:此脚本仅供学习使用,具体需要根据实际情况进行测试调整。

1 系统要求

image-20220723144645594.png

2 脚本执行效果

2.1 管理员登录效果

image-20220723150654800.png

2.2 普通用户登录效果

image-20220723150721458.png

2.3 密码文件格式

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

image-20220723150733860.png

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 "{
   mathJaxContainer[1]}{
   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 "{
   mathJaxContainer[4]}{
   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 {
   mathJaxContainer[8]}{
   FILENAME} ];then
            echo "文件已存在!"
        else
            touch {
   mathJaxContainer[9]}{
   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 {
   mathJaxContainer[14]}{
   FILENAME} -a -x ${FILENAME} ];then
            echo "Readable & Writeable & Executable"
        elif [ -r {
   mathJaxContainer[15]}{
   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实现.

目录
相关文章
|
2月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
207 3
Linux系统禁用swap
|
2月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
292 3
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
405 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
276 0
Linux系统初始化脚本
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
289 2
|
2月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
225 18
|
2月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
263 1
|
2月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
963 1
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1502 10