Article directory
Simulate Linux file administrator system - shell implementation
Note: This script is only for learning and needs to be adjusted according to the actual situation.
1 System Requirements
2 script execution effect
2.1 Administrator login effect
2.2 Common user login effect
2.3 Password file format
Separated by spaces, from left to right:
whether the user name and password are administrators (1 is an administrator, 0 is a normal user), whether they are locked (1 is locked, 0 is unlocked)
3 Implement the script
[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 password file
[root@waluna ~]# cat auth.pass
admin 123456 1 0
waluna waluna 0 0
[root@waluna ~]#
5 Description
There are still some problems with this script. For example, if the password file is not created in advance, it will result in failure to log in and an error will be reported; the menu is implemented using select, and the format cannot be customized. You can modify the script by yourself to achieve more complete functions.
Original link: Simulate Linux file administrator system - shell implementation .