65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/bash
 | |
| 
 | |
| RETRIES=0
 | |
| MAXRETRIES=5
 | |
| RETRYSLEEP=4
 | |
| 
 | |
| onexit() {
 | |
|     return
 | |
| }
 | |
| 
 | |
| checkpassword() {
 | |
|     local PASS=${2//$/\\$}
 | |
|     expect << EOF >/dev/null
 | |
| spawn su $1 -c "exit"
 | |
| expect "Password:"
 | |
| send "${PASS}\r"
 | |
| expect eof
 | |
| catch wait result
 | |
| exit [lindex \$result 3]
 | |
| EOF
 | |
| }
 | |
| 
 | |
| header() {
 | |
|     clear
 | |
|     echo ""
 | |
|     echo ""
 | |
|     echo ""
 | |
|     echo ""
 | |
|     if [ "${RETRIES}" -ne 0 ]; then
 | |
|         echo "Locked by ${USER} (${RETRIES} failed login attempts)"
 | |
|     else
 | |
|         echo "Locked by ${USER}"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| authenticate() {
 | |
|     header
 | |
|     local PASSWORD=""
 | |
|     local RETRY=0
 | |
|     while true; do
 | |
|         read -s -p "Password: " PASSWORD
 | |
|         echo
 | |
|         checkpassword ${USER} "${PASSWORD}"
 | |
|         if [ "$?" -eq 0 ]; then
 | |
|             echo "Welcome back!"
 | |
|             echo ""
 | |
|             exit 0
 | |
|         else
 | |
|             RETRIES=$((RETRIES+1))
 | |
|             RETRY=$((RETRY+1))
 | |
|             echo "authentication failed!"
 | |
|             echo ""
 | |
|             if [ "${RETRY}" -ge "${MAXRETRIES}" ]; then
 | |
|                 RETRY=0
 | |
|                 echo "sleeping for ${RETRYSLEEP}"
 | |
|                 sleep ${RETRYSLEEP}
 | |
|                 header
 | |
|             fi
 | |
|         fi
 | |
|     done
 | |
| }
 | |
| 
 | |
| trap onexit 1 2 3 15 18 20 ERR
 | |
| authenticate
 |