![]() |
Hej och välkommen från USA till UNIX och Linux Forum! Tack för ditt besök och gå med i vår globala gemenskapen.
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här. |
Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Senaste Inlägg |
| su? Vem inloggad först?? | varungupta | UNIX för avancerade & Expertanvändare | 2 | 01-24-2008 04:10 |
| utloggad användare | roshni | Post här för att kontakta Webbplatsadministratörer och Moderatorer | 1 | 07-06-2007 04:02 |
| Hitta senaste Temne användare inloggade | jyoung | UNIX for Dummies Frågor & Svar | 11 | 04-20-2005 03:03 |
| vet vem som är inloggad och loggat ut med sina tider | vkandati | UNIX for Dummies Frågor & Svar | 3 | 03-09-2005 10:04 |
| Är användaren inloggad? | Provo | UNIX for Dummies Frågor & Svar | 1 | 12-07-2001 05:41 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
Senaste Temne inloggad
Arbeta i AIX (alltså ingen date-d)
Hur kan jag visa alla användare som inte har loggat in för mer än 40 dagar? En liten sammanfattning manus skulle vara bra, är mina skript alltid tar för lång tid att genomföra, även innan de är klara. Stort tack! |
|
||||
|
Gamla C-kod för att kontrollera / var / adm / wtmp - som förra kommandot. Det kan kompilera / köra på din box om / var / adm / wtmp finns och det är inte / var / adm / wtmpx - ett annat format.
Kod:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <utmp.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
#include <errno.h>
/* error macro */
#define ck(x) if ((x)==NULL) \
{barf("Memory/File error");}
/* limits */
#define USER_NAME_LEN 8
#define MAX_USERS 2000
/* array of usernames and times */
typedef struct
{
char user[12];
time_t logtime;
} ulog_t;
ulog_t array[MAX_USERS]={ {0x0}, 0 };
/* exit point for errors */
void barf(const char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}
/* return size of file in bytes */
size_t filesize(const int fd)
{
struct stat st;
if(fstat(fd, &st) == (-1) )
barf("Cannot stat file");
return st.st_size;
}
/* return time_t seconds for ndays in the past */
time_t days_ago(const time_t ndays)
{
time_t then=0;
errno=0;
then=time(NULL);
if(then == (time_t)-1 && errno)
barf("");
then-=(86400 * ndays);
return then;
}
/* map the utmp file into memory */
void *mappit(FILE *u, size_t ulen)
{
void *addr=mmap((void *)0, ulen, PROT_READ, MAP_PRIVATE, fileno(u),0);
if (addr==MAP_FAILED)
barf("mmap failed");
return addr;
}
/* unmap file */
int unmappit(void *addr, size_t len)
{
if( munmap(addr,len)==(-1))
return 1;
return 0;
}
/* find user in array, change time or (if not found) add to array */
void find(const struct utmp *src, int *cnt)
{
int i=0;
int found=0;
int limit=*cnt;
char tmp[10]={0x0};
snprintf(tmp, USER_NAME_LEN+1, "%s",src->ut_user);
if(strlen(tmp)> 0 )
{
for(i=0; !found && i < limit; i++)
{
if(strncmp(tmp, array[i].user, USER_NAME_LEN)==0)
{
found=1;
if(src->ut_time > array[i].logtime)
array[i].logtime=src->ut_time;
}
}
if(found==0)
{
memcpy(array[limit].user, tmp, USER_NAME_LEN);
array[limit].logtime=src->ut_time;
limit++;
}
*cnt=limit;
}
}
void setup_array(const void *addr, int *arrlen, const size_t ulen)
{
int i=0;
int max=ulen/sizeof(struct utmp);
int cnt=0;
const struct utmp *f=(const struct utmp *)addr;
for(i=0; i<max; i++, f++)
{
if(f->ut_type==USER_PROCESS && strlen(f->ut_user))
{
find(f, &cnt);
}
}
*arrlen=cnt;
}
int between(const time_t ckval, const time_t low, const time_t high)
{
int retval=(ckval >= low && ckval <= high);
return retval;
}
int search(const time_t low_limit, const time_t high_limit, int arrlen)
{
int i=0;
char tmp[80]={0x0};
time_t lt=0;
ulog_t *p=array;
for(i=0; i < arrlen; i++, p++)
{
if( (high_limit && between(p->logtime, low_limit, high_limit)) ||
(!high_limit && p->logtime < low_limit) )
{
lt=p->logtime;
strftime(tmp, sizeof(tmp), "%c", localtime(<));
printf("%s: last login %s\n", p->user, tmp);
}
}
return 0;
}
/*************************
*
* search for the last time each one logged on
* if logon in time range prt it
***************************/
int process(FILE *u, const time_t low_limit, const time_t high_limit)
{
int retval=0;
size_t ulen=filesize(fileno(u));
int arrlen=0;
void *addr=mappit(u, ulen);
setup_array(addr, &arrlen, ulen);
retval=search(low_limit, high_limit, arrlen);
retval|=unmappit(addr, ulen);
return retval;
}
/*
first argument req'd: # days
read from /var/adm/wtmp - (file used by last)
print all users with last logins < low_limit or with
last logins between low_limit and high_limit when
high_limit is non-zero
*/
int main(int argc, char **argv)
{
int retval=0;
const time_t low_limit= (argc>1) ? days_ago(atoi(argv[1])): 0;
const time_t high_limit=(argc>2) ? days_ago(atoi(argv[2])): 0;
FILE *u=fopen("/var/adm/wtmp", "r");
ck(u);
if ( low_limit > 0 && (high_limit==0 || high_limit >= low_limit))
retval=process(u, low_limit, high_limit);
else
{
fprintf(stderr,
"Bad parameters.\n\tONE required: <number days ago>\n\tOptional: <most recent day>\n");
fprintf(stderr," usage: utmp 10 5\n");
retval=1;
}
return retval;
}
|
|
||||
|
Finns det en ". Lastlogin"-fil i användarens hemkatalog. Om detta finns det en storlek av 0 och dess mtime är lika med den senaste inloggning gången.
Så förmodligen: find /-name. lastlogin-mtime 40 Om den inte finns kan du lägga till "touch. Lastlogin" till varje användares. Profile och vänta 40 dagar för den första förekomsten |
|
||||
|
Många tack så länge!
Tack för förslag!
Emellertid har jag kommit fram till detta! Det är inte snabb, men det gör jobbet! #! / usr / bin / ksh ##### # # Konfigurera globala variabler # ##### MIN_DAYS \u003d 2 MAX_DAYS \u003d 90 DEF_GROUP \u003d "CPX" DATECALC \u003d "<patch_to_datecalc>" ##### # # Preliminära tester # ##### # # Test för rätt parametrar överförs eller rapportera Usage # fallet $ # i 1) NUM_DAYS \u003d $ 1 SEARCH_GROUP \u003d $ DEF_GROUP ;; 2) NUM_DAYS \u003d $ 1 SEARCH_GROUP \u003d $ 2 ;; *) echo "Usage: $ (basename $ 0) <num_days> [<group>]" exit 1 ;; ESAC # # Testa att antalet passerade dagar i rad (och därmed ett nummer) # if [$ (NUM_DAYS)-lt $ (MIN_DAYS)] | | [$ (NUM_DAYS)-gt $ (MAX_DAYS)] sedan echo "<num_days> ($ (NUM_DAYS)) bör vara> $ (MIN_DAYS) & & <$ (MAX_DAYS)" exit 1 fi # # Testa att gruppnamnet passerade existerar # grep-q "^ $ (SEARCH_GROUP)" / etc / group om [$? \u003d 1] sedan echo "<group> ($ (SEARCH_GROUP)) not found!" exit 1 fi ##### # # Declare Lokala Funktioner och fylla arrays # ##### Dateformat () ( DATE_MONTH \u003d $ (echo "Jan \ nFeb \ nMar \ napr \ nMay \ nJun \ nJul \ nAug \ nSep \ nOct \ nnov \ nDec" | grep-n $ 2 | awk-F ':' '(print $ 1)') print "$ 5 $ (DATE_MONTH) $ 3" return 0 ) ##### # # Starta programmet! # ##### SEARCH_NUM \u003d $ (grep "^ $ (SEARCH_GROUP)" / etc / group | awk-F ':' '(print $ 3)') IDAG \u003d $ (Dateformat $ (date | awk '(print $ 1 "" $ 2 "" $ 3 "" $ 4 "" $ 6)')) for i in $ (grep "$ (SEARCH_NUM)" / etc / passwd | awk-F ':' '(print $ 1)') göra # # Se till att användaren har loggat in innan du försöker att behandla dem # grep-p "^ $ (i)" / etc / security / lastlog | grep-q time_last_login om [$? \u003d 0] sedan LOGGED_DATE \u003d $ (perl -le 'print scalar localtime shift "$ (grep-p" ^ $ (i) "/ etc / security / lastlog | grep time_last_login | awk' (print $ 3) ')) LOGGED_IN \u003d $ (Dateformat $ (LOGGED_DATE)) DIFF_DAYS \u003d$(${ DATECALC)-a $ (IDAG) - $ (LOGGED_IN)) if [$ (DIFF_DAYS)-GE $ (NUM_DAYS)] sedan Typeset-L9 USER \u003d "$ (i):" Typeset-R4 NUMMER \u003d $ (DIFF_DAYS) echo "$ (USER) $ (NUMBER) dagar ($ (LOGGED_DATE))" fi fi gjord Naturligtvis är min AIX kodning lite skräp, så om någon kan se hur man påskynda detta skulle jag vara intresserad. Jag har använt datecalc manus från detta forum för att utföra en dag ta bort den andra! |
|
||||
|
Min Linux-kod för dem som är intresserade
#! / bin / bash
NUM_DAYS \u003d "0" TODAY_CODE \u003d $ (echo "$ (date +% s) / 86400" | bc) for i in $ (cat / etc / passwd | awk-F ':' '(print $ 1)') göra senast | grep $ (i)> / dev / null 2> & 1 om [$? -eq 0] sedan DATE_TEXT \u003d $ (senaste | grep $ (i) | head -1 | awk '(print $ 5 "" $ 6)') DATE_CODE \u003d $ (echo "$ (date-d" $ (DATE_TEXT) "+% s) / 86400" | bc) DIFF_DAYS \u003d $ (echo "$ (TODAY_CODE) - $ (DATE_CODE)" | bc) if [$ (DIFF_DAYS)-GE $ (NUM_DAYS)] sedan echo "$ (i) - $ (DIFF_DAYS)" fi fi gjord |
![]() |
| Komihåglista |
| Taggar |
| linux, mtime, perl, perl skift, växla, skift perl |
| Thread Tools | Sök i denna tråd |
| Visningslägen | Betygsätt denna tråd |
|
|