![]() |
|
|
google unix.com
|
|||||||
| Fórumok | Regisztráció | Fórum Szabályok | Linkek | Albumok | GYIK | Tagok listája | Naptár | Keres | Mai hozzászólások | Megjelöl Fórumok Olvas |
| Shell programozás és Scripting Post kérdések KSH, CSH, SH, Bash, Perl, PHP, SED, AWK ÉS EGYÉB shell szkriptek és shell script nyelvek itt. |
Több, UNIX és Linux fórum témák Ön által talált Hasznos
|
||||
| Szál | Thread Starter | Fórum | Válaszok | Utolsó hozzászólás |
| su? Ki bejelentkezve Első? | varungupta | A UNIX a fejlett és szakértői Felhasználók | 2 | 01-24-2008 04:10 PM |
| kijelentkezett felhasználók | roshni | Post Itt léphet kapcsolatba Weblap adminisztrátorok és a moderátorok | 1 | 07-06-2007 04:02 AM |
| Finding utoljára bejelentkezett felhasználók | jyoung | A UNIX a dummies Kérdések és válaszok | 11 | 04-20-2005 03:03 PM |
| tudod, aki bejelentkezett, és kijelentkezett azok időzítések | vkandati | A UNIX a dummies Kérdések és válaszok | 3 | 03-09-2005 10:04 AM |
| Felhasználó jelentkezett be? | Provo | A UNIX a dummies Kérdések és válaszok | 1 | 12-07-2001 05:41 PM |
![]() |
|
|
LinkBack | Téma eszközök | Keresés a téma | Rate Thread | Megjelenítési módok |
|
|
|
||||
|
Utoljára bejelentkezve
Munkavállalás AIX (tehát nincs date-d)
Hogyan lehet megjeleníteni az összes felhasználó, aki nem jelentkezett be több mint 40 napig? Egy kis gyors script lenne, én mindig a parancsfájlok hosszú végrehajtani, még mielőtt elkészült. Nagyon köszönöm! |
|
||||
|
Régi C kódot ellenőrzi a / var / adm / wtmp - mint az utolsó parancs. Lehet compile / run be a mezőbe, ha a / var / adm / wtmp létezik, és ez nem a / var / adm / wtmpx - más formában.
Kód:
#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;
}
|
|
||||
|
Van-e ". Lastlogin" fájlt a felhasználó könyvtárában. Ha ez fennáll, hogy a mérete 0 és mtime egyenlő az utolsó bejelentkezési idő.
Így feltehetőleg: Keresés / nevét. lastlogin-mtime 40 Ha nem létezik akkor a "touch. Lastlogin" minden felhasználó. Bemutatkozása és várjunk 40 nappal az első előfordulás |
|
||||
|
Sok köszönet eddig!
Köszönöm a javaslatokat!
Közben már fel ezt! Ez nem gyorsan, hanem azt a munkát! #! / usr / bin / ksh ##### # # Set up globális változók # ##### MIN_DAYS \u003d 2 MAX_DAYS \u003d 90 DEF_GROUP \u003d "CPX" DATECALC \u003d "<patch_to_datecalc>" ##### # # Előzetes vizsgálatok # ##### # Tesztelt a megfelelő paraméterek kerülnek átadásra vagy jelentés használata # esetben $ a # 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 # Tesztelt, hogy hány nap telt a tartomány (és ezért a szám) # if [$ (NUM_DAYS)-lt $ (MIN_DAYS)] | | [$ (NUM_DAYS)-gt $ (MAX_DAYS)] majd echo "<num_days> ($ (NUM_DAYS)) kell> $ (MIN_DAYS) & & <$ (MAX_DAYS)" exit 1 fi # Tesztelt, hogy a csoport neve telt létezik # grep-q "^ $ (SEARCH_GROUP)" / etc / group if [$? \u003d 1] majd echo "<group> ($ (SEARCH_GROUP)) nem található! exit 1 fi ##### # # Nyilvánítsa helyi feladatai és benépesít tömbök # ##### 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 ) ##### # # Indítsa el a programot! # ##### SEARCH_NUM \u003d $ (grep "^ $ (SEARCH_GROUP)" / etc / group | awk-F ':' '(print $ 3)') TODAY \u003d $ (Dateformat $ (date | awk '(print $ 1 "" $ 2 "" $ 3 "" 4 $ "" $ 6)')) for i in $ (grep "$ (SEARCH_NUM)" / etc / passwd | awk-F ':' '(print $ 1)') tesz # # Győződjön meg arról, hogy ez a felhasználó már bejelentkezett előtt próbálta feldolgozni őket # grep-o "^ $ (i)" / etc / security / lastlog | grep-q time_last_login if [$? \u003d 0] majd 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 $) egy (TODAY) - $ () LOGGED_IN) if [$ (DIFF_DAYS)-ge $ (NUM_DAYS)] majd typeset-L9 USER \u003d "$ (i):" typeset-R4 SZÁMA \u003d $ (DIFF_DAYS) echo "$ (user) $ (NUMBER) nap ($ (LOGGED_DATE))" fi fi kész Természetesen én AIX kódolást egy kicsit szemét, tehát ha valaki tudja, hogyan, hogy gyorsítsák fel ezt én is érdekelhetik. Nekem van használt a datecalc szkript ezt a fórumot, hogy elvégzi a dátum elvegyék a többi! |
|
||||
|
Saját Linux-kódot az érdeklődőket
#! / bin / bash
NUM_DAYS \u003d "0" TODAY_CODE \u003d $ (echo "$ (date +% s) / 86400" | bc) for i in $ (cat / etc / passwd | awk-F ':' '(print $ 1)') tesz utolsó | grep $ (i)> / dev / null 2> & 1 if [$? -eq 0] majd DATE_TEXT \u003d $ (legutolsó | 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)] majd echo "$ (i) - $ (DIFF_DAYS)" fi fi kész |
![]() |
| Könyvjelzõk |
| Címkék |
| linux, mtime, perl, perl műszak, váltás, elterelési perl |
| Téma eszközök | Keresés a téma |
| Megjelenítési módok | Rate this thread |
|
|