首页 > 系统相关 >模拟Linux文件管理员系统-shell实现

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

时间:2023-08-22 20:11:10浏览次数:43  
标签:shell USERR echo else 管理员 USER Linux fi FILENAME

目录

模拟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:                 [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 密码文件

[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实现.

标签:shell,USERR,echo,else,管理员,USER,Linux,fi,FILENAME
From: https://www.cnblogs.com/waluna/p/17646887.html

相关文章

  • 13 Linux 蜂鸣器实验
    一、蜂鸣器驱动原理  常用蜂鸣器分两种,有源蜂鸣器和无源蜂鸣器。  它们俩的区别:有源蜂鸣器具有内置的振荡器和驱动电路,无源蜂鸣器没有;源蜂鸣器只需简单的数字信号来控制,无源蜂鸣器需要外部电路或微控制器来提供特定频率的脉冲信号。  在Linux下做的工作:①设备树中添加......
  • linux脚本手动占用cpu核数
    希望启动一个脚本,能够指定占用的cpu核数#!/bin/bash#filenamekillcpu.shendless_loop(){echo-ne"i=0;whiletruedoi=i+100;i=100done"|/bin/bash&}if[$#!=1];thenecho"USAGE:$0<CPUs>"exit1;fiforiin`seq$1`doendless......
  • Clickhouse的极简安装-之二(macos+linux)
    Clickhouse的极简安装-之二(macos+linux)StudyFromhttps://clickhouse.com/docs/en/install然后简单的获取方式:curlhttps://clickhouse.com/>ck.url其实可以看到他的安装命令了.命令拆解if["${OS}"="Linux"]thenif["${ARCH}"="x86_64&q......
  • 如何在linux下快速查看一个文件的列数
     使用`awk`命令:```bashawk'{printNF;exit}'文件名```这个命令将打印文件的第一行的列数,并立即退出。如果只关心文件的第一行列数,这是一个快速的方法。使用`head`命令:```bashhead-n1文件名|awk'{printNF}'```这个命令将打印文件的第一行,并通过管道将其传递给......
  • 14.linux命令ps
    14.linux命令ps1.psaux对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令(ProcessStatus)就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过......
  • 如何在Kali Linux上安装remmina
    在本教程中,我们学习如何在KaliLinux上安装remmina。remmina是GTK+远程桌面客户端介绍在本教程中,我们学习如何remmina在KaliLinux上安装。什么是remminaremmina:Remmina是一个用GTK+编写的远程桌面客户端,旨在对需要在大型显示器或小型上网本前处理大量远程计算机......
  • 13.Linux中fork函数详解(附图解与代码实现)
    13.Linux中fork函数详解(附图解与代码实现)我们先来看个代码,判断一下这个代码的输出结果会是什么样的,先不要去看运行结果,判断好后再去看看是否和你的预期结果一致。#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>intmain(void){ pid_tpid; ......
  • Linux
    了解Linux操作系统:控制硬件和支持软件运行的计算机程序。常见的操作系统:windows,macOS,Linux,IOSlinux分为内核和发行版本:内核:操作和控制硬件的核心东西发行版本:是Linux内核与各种常用软件的产品组合,就是我们常说的操作系统常用的发行版本:Ubuntu、CentOS、Redhat搭建环境双系统优点:运......
  • 【shell 】判断文件夹或文件是否存在
    文件夹不存在则创建if[!-d"/data/"];thenmkdir/dataelseecho"文件夹已经存在"fi文件存在则删除if[!-f"/data/filename"];thenecho"文件不存在"elserm-f/data/filenamefi判断文件夹是否存在if[-d"/data/"];thenec......
  • 【JMeter】使用BeanShell写入内容到文件
    使用BeanShell写入内容到文件目录使用BeanShell写入内容到文件一、前言二、提取三、写入一、前言​ 在我们日常工作中,可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时,就经常能够遇到这种情况。要想达到这种目的,我们一般采取BeanShell后置处理器......