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
 |