模拟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 "{
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实现.