Skip to content

antony@notes:~/ops-automation$ cat "偽-passwd-program.md"

偽 passwd program

2022-08-11· ops-automation ·Shell Script

偽 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
fi