[toc] # 模擬Linux文件管理員系統-shell實現 **註:此腳本僅供學習使用,具體需要根據實際情況進行測試調整。** ## 1 系統要求 ![](https://img2023.cnblogs.com/blog/3262925/202308/3262925-202308211934402 ...
目錄
模擬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://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實現.