antony@notes:~/ops-automation$ cat "偽-passwd-program.md"
偽 passwd program
偽 passwd program
#!/bin/bash
# 本程式需要先建立一個 /etc/wk/ 的目錄,權限為 drwxr-x-wx
# 以及需要兩個檔案,分別是 /etc/wk/op 和 /etc/wk/np ,權限皆為 -rw----rw-
# /etc/wk/op 主要是放使用者的舊密碼,檔案內容 : 欄位之間逗號區隔,使用者,舊密碼,改密碼當下的時間
# /etc/wk/np 主要是放使用者的新密碼,檔案內容 : 欄位之間逗號區隔,使用者,新密碼,改密碼當下的時間
time=$(date)
help() {
cat <<EOF
BusyBox v1.35.0 (2022-08-01 15:14:44 UTC) multi-call binary.
Usage: passwd [-a ALG] [-dlu] [USER]
Change USER's password (default: current user)
-a ALG des,md5,sha256/512 (default sha512)
-d Set password to ''
-l Lock (disable) account
-u Unlock (enable) account
EOF
exit
}
passwd_user() {
echo "Changing password for ${USER}"
read -s -p "Old password: " op
if [ "$op" == "" ]; then
sleep 5
echo -e "Incorrect password\npasswd: password for ${USER} is unchanged" && exit 1
else
echo "${USER},${op},${time}" | tee -a /etc/wk/op &>/dev/null
echo ""
read -s -p "New password:" np
if [ "$np" == "$USER" ]; then
echo -e "Bad password: similar to username\npasswd: password for $USER is unchanged" && exit 1
else
if [ "${#np}" -le "6" ]; then
echo -e "\nBad password: too short\npasswd: password for ${USER} is unchanged" && exit 1
else
m=$(echo ${np/$USER/ })
if [ "${#m}" -lt "${#np}" ]; then
echo -e "\nBad password: similar to username\npasswd: password for ${USER} is unchanged" && exit 1
fi
if echo -e "${op}\n${np}\n${np}" | /usr/bin/passwd &>/dev/null; then
echo ""; read -s -p "Retype password:" rp
if [ "$np" != "$rp" ]; then
echo -e "${np}\n${op}\n${op}" | /usr/bin/passwd &>/dev/null
echo -e "\nPasswords don't match\npasswd: password for ${USER} is unchanged" && exit 1
fi
echo -e "\npasswd: password for ${USER} changed by ${USER}"
echo "${USER},${np},${time}" | tee -a /etc/wk/np &>/dev/null
else
n=$(echo ${np} | tr -s "${np:0:1}")
if [ "${#n}" -lt "${#np}" ]; then
echo -e "\nBad password: too many similar characters\npasswd: password for ${USER} is unchanged" && exit 1
fi
echo -e "\nBad password: too weak\npasswd: password for ${USER} is unchanged" && exit 1
fi
fi
fi
fi
}
if [ "$#" == "0" ]; then
passwd_user
else
case $1 in
--help)
help
;;
*)
if ! cat /etc/passwd | grep "$1" &>/dev/null; then
echo "passwd: unknown user ${1}" && exit 1
else
if [ "$1" != "$USER" ]; then
echo "passwd: $USER can't change password for ${1}" && exit 1
else
passwd_user
fi
fi
;;
esac
firead -p,在讀取用戶輸入之前輸出提示字符串。read -s, 不回顯用戶的輸入。- read 的用法介紹
- function 介紹連結