The UNIX and Linux Forums  
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.

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Sök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 04-23-2007
ughosting ughosting is offline
Registered User
  
 

Join Date: april 2007
Inlägg: 3
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!
  #2 (permalänk)  
Old 04-25-2007
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: februari 2004
Ort: NM
Inlägg: 5.763
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(&lt));
			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;
}
  #3 (permalänk)  
Old 04-25-2007
jgt jgt is offline
Registered User
  
 

Join Date: april 2007
Ort: 44.21.48N 80.50.15W
Inlägg: 452
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
  #4 (permalänk)  
Old 04-25-2007
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: februari 2004
Ort: NM
Inlägg: 5.763
Han kanske också vill nätverk inloggningar ...

Läsa en redovisning fil är ganska mycket garanterat att hitta alla.
  #5 (permalänk)  
Old 04-26-2007
ughosting ughosting is offline
Registered User
  
 

Join Date: april 2007
Inlägg: 3
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!
  #6 (permalänk)  
Old 04-26-2007
ughosting ughosting is offline
Registered User
  
 

Join Date: april 2007
Inlägg: 3
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
Closed Thread

Komihåglista

Taggar
linux, mtime, perl, perl skift, växla, skift perl

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 09:12.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0