Listing 3: oldacct script
#!/bin/sh
#
# oldacct
#
# Identify accounts not used for over 90 days.
#
# Copyright 1994, Lawrence S Reznick
#
# 94Apr19 LSR
# Finger doesn't always show "On since" when the
# user is still logged in. If the user has been
# idle, finger shows the minutes & seconds idle.
# Added a test for "Idle" to catch that. Also
# found one acct that had a home phone field.
# Finger outputs that on a separate line, pushing
# the "Last logged in" line to the 5th line. The
# word "Directory:" appears on the 4th line when
# that happens. Added a test to handle that.
# Finally, changed the "Never logged in" code to
# collect the names. After the loop finishes, the
# names are output in a columnar list. Looks
# cleaner that way.
PW_FILE=/etc/passwd # Point to passwd file
LOWUID=200 # Lowest non-admin UID
monthnum ()
{
Jan=1 Feb=2 Mar=3 Apr=4 May=5 Jun=6
Jul=7 Aug=8 Sep=9 Oct=10 Nov=11 Dec=12
echo `eval echo $"$1"` # Show month's number
}
EXPMONTH=`date "+%m"` # Get current date
EXPDAY=`date "+%d"`
EXPYEAR=`date "+%Y"`
CURRMONTH=$EXPMONTH
CURRYEAR=$EXPYEAR
if [ $EXPMONTH -le 3 ]
then
EXPMONTH=`expr $EXPMONTH + 9` # Wrap around year
EXPMONTH=`expr $EXPYEAR - 1`
else
EXPMONTH=`expr $EXPMONTH - 3`
fi
if [ $EXPMONTH -eq 2 -a $EXPDAY > 28 ]
then
EXPDAY=28 # Force Feb 28
fi
#
# Turn month number into that month's name
#
#Months="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
#set $MONTHS # Create associative array
#EXPMONTH=`eval echo $"$EXPMONTH"` # Select month's name
#
# Collect all non-administrative users' names
#
USERS=`
awk '
BEGIN { FS = ":" }
$3 >= LOWUID { print $1 }
' LOWUID=$LOWUID $PW_FILE |
sort`
#
# Find last login time for each user
#
for u in $USERS
do
# echo "$u\t\t\r\c"
LAST=`finger -m $u 2>/dev/null | sed -n '4p'`
set $LAST # Parse last login line
while [ $# -lt 5 ] # Handle special message
do
if [ "$LAST" = "Never logged in." ]
then
# echo $u"\t"$LAST
NOLOGIN="$NOLOGIN $u"
break
fi
# Special case when home phone is in GECOS field
if [ "$1" = "Directory:" ] # Phone pushed all 1 line down
then
LAST=`finger -m $u 2>/dev/null | sed -n '5p'`
set $LAST
continue
fi
# Special case when phone number isn't in GECOS field
LAST=`finger -m $u 2>/dev/null | sed -n '3p'`
set $LAST
done
if [ $# -lt 4 ] # Never logged in
then
continue
fi
if [ "$1" - "On" -a "$2" - "since" ] # Still logged in
then
continue # Don't tell anyone
fi
if [ "$5" = "Idle" ]
# Still logged in
then
continue # Keep going
fi
OLDMONTH=$4
OLDDAY=$5
OLDYEAR=$6
# If last login was within 6 months,
# year will be an hh:mm time
if [ $OLDYEAR -gt 999 ] # It must be >= 6 months old
then
echo "$u"\t"$OLDMONTH $OLDDAY $OLDYEAR
continue
fi
if [ `monthnum $OLDMONTH` -lt $EXPMONTH -o \
`monthnum $OLDMONTH` -gt $CURRMONTH ]
then
echo "$u"\t"$OLDMONTH $OLDDAY $OLDYEAR
continue
fi
if [ `monthnum $OLDMONTH` -eq $EXPMONTH -a \
$OLDDAY -lt $EXPDAY ]
then
echo "$u"\t"$OLDMONTH $OLDDAY $OLDYEAR
continue
fi
done
if [ -n "$NOLOGIN" ]
then
echo "Never logged in:"
echo $NOLOGIN | tr ' ' '\012' | pr -t -6
fi
|