Hello,
In response to my question about how to identify "inactive" users
I received several responses suggesting to parse the output from
"finger" and "last".
I also received a "C" program as shown below.
usage:
inactive 90 {will list all users who have not logged in 90 days.
/* List users whose last login was at least as many days ago as the
specified argument. */
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <pwd.h>
#include <lastlog.h>
#define LASTLOGS "/var/adm/lastlog"
#define SECPERDAY 86400
void main(int ac, char **av)
{
static FILE *logs;
static time_t cutoff, earliest = 0;
static struct passwd *pwd;
static struct lastlog log;
static long log_offset;
static char *asctim, strtime[12];
if (ac != 2) {
fprintf(stderr,"usage: inactive number-of-days\n");
exit(2);
}
if (!( logs = fopen(LASTLOGS,"r") )) {
perror(LASTLOGS);
exit(2);
}
cutoff = time(0) - abs(atoi(av[1]))*SECPERDAY;
for (setpwent(); pwd = getpwent(); ) {
if (!strcmp(pwd->pw_passwd,"*") || !strcmp(pwd->pw_passwd,"Nologin"))
continue;
log_offset = pwd->pw_uid * sizeof(log);
if (fseek(logs,log_offset,SEEK_SET)) {
perror("fseek lastlogs");
exit(2);
}
if (fread(&log,sizeof(log),1,logs) != 1) continue;
if (log.ll_time > 0 && (log.ll_time < earliest || earliest == 0))
earliest = log.ll_time;
if (log.ll_time >= cutoff) continue;
if (log.ll_time == 0)
strcpy(strtime,"never");
else {
asctim = ctime(&log.ll_time);
sprintf(strtime,"%.2s-%.3s-%.4s",asctim+8,asctim+4,asctim+20);
}
printf("%-8s %-30.30s %s\n",pwd->pw_name,pwd->pw_gecos, strtime);
}
endpwent();
if (earliest > 0) {
asctim = ctime(&earliest);
printf("\nRecords go back to %.2s-%.3s-%.4s\n", asctim+8,
asctim+4, asctim+20);
Arun Sanghvi
GENE
Received on Tue Sep 29 1998 - 00:52:47 NZST