Página 1 de 1

Notificación de contraseña expirada

Publicado: Mié, 28 Sep 2011, 13:49
por 103
He estado buscando en estos días, pero sin suerte algún script ya sea en bash, Perl o cualquier lenguaje que envie una notificación a los usuarios siete días antes de que su contraseña del sistema expire. He tratado de hacerlo en bash apoyándome en chage o passwd pero no he logrado nada aún. Si alguien tuviera alguna experiencia en este tema, por favor, compartirla.

Re: Notificación de contraseña expirada

Publicado: Mié, 28 Sep 2011, 20:08
por hugo
Bueno, 7 días es la cantidad por defecto para el parámetro warning del archivo /etc/shadow, al menos en Debian.

En fin, quizás algo como esto te funcione:

Código: Seleccionar todo

#!/bin/sh

LISTADO=`cat /etc/passwd | grep -i "bash" | awk -F: '$3 > 500 {print $1}'`

for USUARIO in ${LISTADO}
do
	chage -W 7 ${USUARIO};
done
Ojo, este script lo que hace es establecer la alerta de cambio de contraseña en 7 días para todos los usuarios que inician sesión con bash y cuyo id sea mayor que 500. El propio sistema operativo debe emitir la alerta al usuario en cuanto este inicie sesión, por eso no se ha incluido dicha funcionalidad.

Re: Notificación de contraseña expirada

Publicado: Jue, 29 Sep 2011, 08:25
por 103
Sí, pero la altera a la que me refería era notificación vía correo, esa parte de establecer el warning y la cantidad de días a caducar el password ya la tenía lista, encontré este script y me funciona a las mil maravillas, solo que tuve que traducirlo, lo posteo tal y como estaba en el sitio que lo encontré, ojalá y les sea útil a todos.
#!/bin/sh
#
# Goran Cvetanoski - 19/12/2006
#
# pwage
#
# This script works out the time left before a password expires
#
# It will send a reminder email 10 days and 3 days before the password
# will expire. The email will go to unix.admin@mydomain.com.au unless an
# alternate email address is specified. An email will also be sent if a
# password has expired.
#
# The following command will send results to unix.admin@mydomain.com.au
# pwage oracle
#
# Specify an alternate email address if you would like the results to be
# sent to a different email address.
# ie:
# pwage oracle oracledba@mydomain.com.au
#
#
# CHANGE LOG
# =========================================================================
# 19/12/2006 - Goran Base script created
# 05/08/2009 - Ricky Smith added code to check each user
#

LOG=/tmp/pwage.log

DASHES="-----------------------------"

show()
{
echo "$DASHES $1 $DASHES" >> $LOG
shift
eval "$@" >> $LOG
echo "" >> $LOG
}

SendMail()
{
cat $LOG | mailx -s "$1" "$2"
}

reminder ()
{

echo "Date: `date`"
echo ""
echo "Please change your password within the next $EXPIRE days"
}

expired ()
{
echo "Date: `date`"
echo ""
echo "The password for $USER has expired"
echo "$USER last changed their password on $LSTCNG"
echo "The maximum age for the password is $MAX days"
echo "and it has expired $EXPIRE days ago"
}

CheckUser()
{
USER=$1
EMAIL=$2

CURRENT_EPOCH=`grep $USER /etc/shadow | cut -d: -f3`
if [ "$CURRENT_EPOCH" = "" ]; then
return
fi

# Find the epoch time since the user's password was last changed
EPOCH=`perl -e 'print int(time/(60*60*24))'`

# Compute the age of the user's password
AGE=`echo $EPOCH - $CURRENT_EPOCH | bc`

# Compute and display the number of days until password expiration
MAX=`grep $USER /etc/shadow | cut -d: -f5`
if [ "$MAX" = "" ]; then
return
fi

EXPIRE=`echo $MAX - $AGE | bc`

CHANGE=`echo $CURRENT_EPOCH + 1 | bc`
LSTCNG="`perl -e 'print scalar localtime('$CHANGE' * 24 *3600);'`"

WARN=`grep $USER /etc/shadow | cut -d: -f6`
if [ "$WARN" = "" ]; then
WARN=0
fi

if [ "$EXPIRE" -le "$WARN" ]; then
show "R E M I N D E R" reminder
SendMail "$USER Password Info On `uname -n`" "$EMAIL"
elif [ "$EXPIRE" -lt 0 ]; then
show "E X P I R E D" expired
SendMail "WARNING: $USER Password Expired On `uname -n`" "$EMAIL"
fi
}

# Main Code
domain=$1
if [ "$domain" = "" ]; then
domain=$(dnsdomainname)
fi

minuid=$2
if [ "$minuid" = "" ]; then
minuid=500
fi

IFS=':'
while read user pass uid gid full home shell
do
if [ $uid -ge $minuid ]; then
cat /dev/null > $LOG
CheckUser $user "\"$full\" <$user@$domain>"
fi
done </etc/passwd