The UNIX and Linux Forums  

Go Back   В UNIX и Linux Форумы > Топ форумы > Shell программирование и сценарии
.
Google unix.com



Shell программирование и сценарии Почтовые вопросы о KSH, CSH, SH, BASH, Perl, PHP, SED, AWK и скрипты оболочки и оболочки скриптовых языков здесь.

Подробнее UNIX и Linux Темы форума можно найти полезные
Нить Резьба для начинающих Форум Ответы Последнее сообщение
вс?? Кто вошли в первую очередь?? varungupta UNIX перспективных И опытных пользователей 2 01-24-2008 04:10 PM
выполнен выход пользователей roshni Почтовые здесь, чтобы связаться с сайта Администраторы и модераторы 1 07-06-2007 04:02 AM
Поиски последнего времени пользователей войти в систему jyoung UNIX для чайников Вопросы И Ответы 11 04-20-2005 03:03 PM
кто зарегистрирован и войти в их сроки vkandati UNIX для чайников Вопросы И Ответы 3 03-09-2005 10:04 AM
Является ли пользователь вошел в систему?? Прово UNIX для чайников Вопросы И Ответы 1 12-07-2001 05:41 PM

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 Оценить Thread Режимы дисплея
Old 04-23-2007
ughosting ughosting is offline
Зарегистрированный пользователь
  
 

Регистрация: Apr 2007
Сообщений: 3
В последнее время вошли в систему

Работа в AIX (так, что ни дата-D)

Как мне просмотреть все пользователи, которые не вошли в систему в течение более 40 дней?

Небольшой быстрый сценарий был бы полезен, мои скрипты всегда принимая к длительным выполнить, даже до того, как они закончили.

Большое спасибо!
Old 04-25-2007
Джим Макнамара jim mcnamara is offline Forum Staff  
...@...
  
 

Регистрация: Февраль 2004
Местонахождение: Н. М.
Сообщения: 5807
Старая C код для проверки / VAR / ADM / wtmp - как последняя команда. Он может скомпилировать / запустить на своем поле, если в / VAR / ADM / wtmp существует и это не / VAR / ADM / wtmpx - другой формат.


Код:
#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;
}

Old 04-25-2007
jgt jgt is offline
Зарегистрированный пользователь
  
 

Регистрация: Apr 2007
Место проведения: 44.21.48N 80.50.15W
Сообщений: 455
Есть ли ". Lastlogin" файл в домашней директории пользователя. При этом существует она имеет размер 0 и mtime равно до последнего времени входа.
Таким образом, предположительно:
Найти /-имя. lastlogin-mtime +40

Если она не существует, вы можете добавить "Touch. Lastlogin" для каждого пользователя. Профиль
и ждать 40 дней для первого появления
Old 04-25-2007
Джим Макнамара jim mcnamara is offline Forum Staff  
...@...
  
 

Регистрация: Февраль 2004
Местонахождение: Н. М.
Сообщения: 5807
Он может также хочу сети логины ...

Чтение бухгалтерской файл довольно много гарантированно найдете все.
Old 04-26-2007
ughosting ughosting is offline
Зарегистрированный пользователь
  
 

Регистрация: Apr 2007
Сообщений: 3
Большое спасибо до сих пор!!

Спасибо за предложения!

Тем временем я пришел с этой!

Это не быстро, но это задание!

#! / USR / BIN / KSH

#####
#
# Установка глобальных переменных
#
#####

MIN_DAYS \u003d 2
MAX_DAYS \u003d 90
DEF_GROUP \u003d "cpx"
DATECALC \u003d "<patch_to_datecalc>"

#####
#
# Предварительные тесты
#
#####

#
# Проверка правильности параметров передаются или отчет по использованию
#

случае $ # в

1)

NUM_DAYS \u003d $ 1
SEARCH_GROUP \u003d $ DEF_GROUP
;;

2)

NUM_DAYS \u003d $ 1
SEARCH_GROUP \u003d $ 2
;;

*)

Эхо "Использование: $ (basename $ 0) <num_days> [<group>]"
Exit 1
;;

esac

#
# Испытаний, что количество дней прошли в диапазоне (и, следовательно, число)
#

если [$ () NUM_DAYS-LT $ MIN_DAYS ()] | | [$ () NUM_DAYS-GT $ MAX_DAYS ()]
тогда

Эхо "<num_days> ($ () NUM_DAYS) должна быть> $ () MIN_DAYS И И <$ MAX_DAYS ()"
Exit 1

FI

#
# Испытаний, что название группы прошло существует
#

grep-Q "^ $ () SEARCH_GROUP" / и т.д. / группа

если [$? \u003d 1]
тогда

Эхо "<group> ($ SEARCH_GROUP ()) не найден!"
Exit 1

FI

#####
#
# Заявляют местные функции и заполнение массивов
#
#####

dateformat () (

DATE_MONTH \u003d $ (Эхо "январь \ nFeb \ nMar \ НАГР \ nMay \ nJun \ nJul \ nAug \ nSep \ nOct \ nNov \ nDec" | grep-N $ 2 | AWK-F ':' '(печати $ 1)')

Версия для печати "$ 5 $ () DATE_MONTH $ 3"
вернуться 0
)

#####
#
# Запустите программу!!!
#
#####

SEARCH_NUM \u003d $ (grep "^ $ () SEARCH_GROUP" / и т.д. / группы | AWK-F ':' '(печать $ 3)')

СЕГОДНЯ \u003d $ ($ dateformat (дата | AWK '(печати $ 1 "" $ 2 "" $ 3 "" $ 4 "" $ 6)'))

Я в $ (grep "$ () SEARCH_NUM" / и т.д. / пароль | AWK-F ':' '(печати $ 1)')
делать

#
# Убедитесь в том, что этому пользователю войти в систему, прежде чем пытаться их обработки
#

grep-P "^ $ (I)" / и т.д. / безопасность / lastlog | grep-Q time_last_login

если [$? \u003d 0]
тогда

LOGGED_DATE \u003d $ (Perl -ле "Печать скалярного Localtime сдвиг '$ (grep-P" ^ $ (I) "/ и т.д. / безопасность / lastlog | grep time_last_login | AWK' (печать $ 3) '))
LOGGED_IN \u003d $ (dateformat $ LOGGED_DATE ())

DIFF_DAYS \u003d$(${ DATECALC)-A $ СЕГОДНЯ () - $ (LOGGED_IN))

если [$ () DIFF_DAYS-GE $ NUM_DAYS ()]
тогда

типографским-L9 USER \u003d "$ (I):"
типографским-R4 ВЫПУСК \u003d $ () DIFF_DAYS
Эхо "$ (USER) $ (NUMBER) дней ($ () LOGGED_DATE)"

FI

FI

готово


Конечно, моя Экс кодирования является немного мусора, так что если кто может видеть, как ускорить этот вопрос я хотел бы быть заинтересованы.

Я использовал datecalc скрипта на этом форуме для выполнения одной даты отнять другой!!
Old 04-26-2007
ughosting ughosting is offline
Зарегистрированный пользователь
  
 

Регистрация: Apr 2007
Сообщений: 3
Мой код Linux для тех, кто интересуется

#! / BIN / Bash

NUM_DAYS \u003d "0"
TODAY_CODE \u003d $ (ECHO "$ (дата +% S) / 86400" | BC)

Я в $ (CAT / и т.д. / пароль | AWK-F ':' '(печати $ 1)')
делать

Конец | grep $ (I)> / Dev / нуль 2> И 1

если [$? эк-0]
тогда

DATE_TEXT \u003d $ (последняя | grep $ (I) | голову -1 | AWK '(печати $ 5 "" $ 6)')
DATE_CODE \u003d $ (ECHO "$ (дата-D" $ DATE_TEXT () "+% S) / 86400" | BC)
DIFF_DAYS \u003d $ (ECHO "$ (TODAY_CODE) - $ (DATE_CODE)" | BC)

если [$ () DIFF_DAYS-GE $ NUM_DAYS ()]
тогда

Эхо "$ (I) - $ (DIFF_DAYS)"

FI

FI

готово
Closed Thread

Закладки

Теги
Linux, mtime, Perl, Perl сдвиг, перемещение, переход на Perl

Резьба Инструменты Искать в этом Thread
Искать в этом Thread:

Расширенный поиск
Режимы дисплея Оценить эту ветку
Оценить эту ветку:

Отправка Правила
Вы не может Начать новую нитей
Вы не может Почтовые ответы
Вы не может Почтовые вложения
Вы не может Редактировать Ваши сообщения

BB код быть На
Смайлики являемся На
[IMG] код На
HTML-код Вне
Trackbacks являемся На
Pingbacks являемся На
Refbacks являемся На




Часовой пояс GMT -4. Текущее время 10:53 AM.


Powered By: Справка, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Язык Переводы на питание от .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
В UNIX и Linux форумы Содержание Copyright © 1993-2009. Все права Reserved.Ad управления по RedTyger

Содержание соответствующие URL-адреса в vBSEO 3.2.0