![]() |
|
|
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 |
![]() |
|
|
LinkBack | Резьба Инструменты | Искать в этом Thread | Оценить Thread | Режимы дисплея |
|
|
|
||||
|
В последнее время вошли в систему
Работа в AIX (так, что ни дата-D)
Как мне просмотреть все пользователи, которые не вошли в систему в течение более 40 дней? Небольшой быстрый сценарий был бы полезен, мои скрипты всегда принимая к длительным выполнить, даже до того, как они закончили. Большое спасибо! |
|
||||
|
Старая 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(<));
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;
}
|
|
||||
|
Есть ли ". Lastlogin" файл в домашней директории пользователя. При этом существует она имеет размер 0 и mtime равно до последнего времени входа.
Таким образом, предположительно: Найти /-имя. lastlogin-mtime +40 Если она не существует, вы можете добавить "Touch. Lastlogin" для каждого пользователя. Профиль и ждать 40 дней для первого появления |
|
||||
|
Он может также хочу сети логины ...
Чтение бухгалтерской файл довольно много гарантированно найдете все. |
|
||||
|
Большое спасибо до сих пор!!
Спасибо за предложения!
Тем временем я пришел с этой! Это не быстро, но это задание! #! / 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 скрипта на этом форуме для выполнения одной даты отнять другой!! |
|
||||
|
Мой код 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 готово |
![]() |
| Закладки |
| Теги |
| Linux, mtime, Perl, Perl сдвиг, перемещение, переход на Perl |
| Резьба Инструменты | Искать в этом Thread |
| Режимы дисплея | Оценить эту ветку |
|
|