Notificación de contraseña expirada

Programacion en Bash

Moderadores: frank, dxfiles

Responder
103
Mensajes: 335
Registrado: Sab, 12 Feb 2011, 16:51

Notificación de contraseña expirada

Mensaje por 103 » Mié, 28 Sep 2011, 13:49

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.

Avatar de Usuario
hugo
Mensajes: 1430
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: La Habana
Contactar:

Re: Notificación de contraseña expirada

Mensaje por hugo » Mié, 28 Sep 2011, 20:08

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.
Lo único que necesita el mal para triunfar es que los hombres buenos no hagan nada.
- Edmund Burke

103
Mensajes: 335
Registrado: Sab, 12 Feb 2011, 16:51

Re: Notificación de contraseña expirada

Mensaje por 103 » Jue, 29 Sep 2011, 08:25

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

Responder