65 lines
1.2 KiB
Plaintext
65 lines
1.2 KiB
Plaintext
|
#!/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
|