Tested on Raspberry Pi but should work on any Debian based OS
# Install Dictionaries if [ $(dpkg-query -W -f='${Status}' wamerican 2>/dev/null | grep -c "ok installed") -eq 0 ]; then sudo apt install wamerican -y; else echo 'Already Installed'; fi if [ $(dpkg-query -W -f='${Status}' wbritish 2>/dev/null | grep -c "ok installed") -eq 0 ]; then sudo apt install wbritish -y; else echo 'Already Installed'; fi # This will combine all words into a new file that we can filter for bad words. sort /usr/share/dict/american-english /usr/share/dict/british-english /usr/share/dict/words | uniq | sudo dd of=words-password # This will be your badwordlist, fill it with the words you would not like to see in a password sudo touch /usr/share/dict/badwordlist
NOTE: With the three languages included you may get some words for your password that may be offensive if you choose not to put words in the badwordlist file. If so just run the script again.
#!/bin/bash CleanUpPassword () { DirtyPassword="$1" #echo "Dirty Password: $DirtyPassword" # Replace i, I, l with a number one CleanPassword=$(echo "$DirtyPassword" | sed "s|i|1|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|I|1|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|l|1|g" ) # Replace a, A with @ CleanPassword=$(echo "$CleanPassword" | sed "s|a|@|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|A|@|g" ) # Replace e, E with 3 CleanPassword=$(echo "$CleanPassword" | sed "s|e|3|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|E|3|g" ) # Replace s, S with $ CleanPassword=$(echo "$CleanPassword" | sed "s|s|$|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|S|$|g" ) # Replace o, O with a number zero CleanPassword=$(echo "$CleanPassword" | sed "s|o|0|g" ) CleanPassword=$(echo "$CleanPassword" | sed "s|O|0|g" ) #echo "Clean Password: $CleanPassword" echo "$CleanPassword" } # Get Random Word - Start GetRandomWord () { passwordwordlist=/usr/share/dict/words-password sWord1=$(shuf -n1 $passwordwordlist); chrlen=${#sWord1} #echo $chrlen; if [ $chrlen -lt 4 ]; then GetRandomWord; elif [ $chrlen -gt 8 ]; then GetRandomWord; fi #echo $sWord1; } GetRandomWordMod () { GetRandomWord #echo $sWord1 first=`echo $sWord1|cut -c1|tr [a-z] [A-Z]`; second=`echo $sWord1|cut -c2-`; sWord2=$(echo $first$second); sWord3=$(echo "$sWord2" | sed 's/a/@/g' | sed 's/e/3/g' | sed 's/i/1/g' | sed 's/o/0/g' | sed 's/u/_/g' | sed 's/y/-/g') #echo $sWord3 } CreatePassword () { # Change Disk Password - Start # Password Format: # ##.Word$.Oth3r # Numbers. Word with Caps and Special Character.Word again # 12-20 Characters in length # Get two digit random number - Start sPWDPart1=$(cat /dev/urandom | env LC_CTYPE=C tr -dc 0-9 | head -c 2; echo) #echo $sPWDPart1 # Get two digit random number - Stop GetRandomWordMod sPWDPart2=$sWord3 GetRandomWordMod sPWDPart3=$sWord3 sFullPWD=$(echo "$sPWDPart1.$sPWDPart2.$sPWDPart3") #sFullPWD=$(cat ~/FileVault.txt) # Change Disk Password - Stop printf "\nProposed Password:\n$sFullPWD\n\nAcceptable?, if yes type y or if no type n followed by [ENTER]:\n" read sPWDCreated case $sPWDCreated in [yY]) clear echo "\nWrite down this ${#sFullPWD} character password:\n$sFullPWD" ;; *) CreatePassword ;; esac } CreatePassword