当前位置:  技术问答>linux和unix

怎样shell提取wtmp中的时间?

    来源: 互联网  发布时间:2016-11-26

    本文导语:  wtmp是二进制文件,要怎样提取出当中存储的时间? struct utmp {    char ut_line[8]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */    char ut_name[8]; /* login name */    long ut_time; /* seconds since Epoch */    };  ...

wtmp是二进制文件,要怎样提取出当中存储的时间?
struct utmp { 
  char ut_line[8]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */ 
  char ut_name[8]; /* login name */ 
  long ut_time; /* seconds since Epoch */ 
  }; 

|
last.c

/*
 * last.c       Re-implementation of the 'last' command, this time
 *              for Linux. Yes I know there is BSD last, but I
 *              just felt like writing this. No thanks :-).
 *              Also, this version gives lots more info (especially with -x)
 *
 * Author:      Miquel van Smoorenburg, miquels@cistron.nl
 *
 * Version:     @(#)last  2.85  30-Jul-2004  miquels@cistron.nl
 *
 *              This file is part of the sysvinit suite,
 *              Copyright 1991-2004 Miquel van Smoorenburg.
 *
 *              This program is free software; you can redistribute it and/or
 *              modify it under the terms of the GNU General Public License
 *              as published by the Free Software Foundation; either version
 *              2 of the License, or (at your option) any later version.
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "oldutmp.h"

#ifndef SHUTDOWN_TIME
#  define SHUTDOWN_TIME 254
#endif

char *Version = "@(#) last 2.85 31-Apr-2004 miquels";

#define CHOP_DOMAIN     0       /* Define to chop off local domainname. */
#define NEW_UTMP        1       /* Fancy & fast utmp read code. */
#define UCHUNKSIZE      16384   /* How much we read at once. */

/* Double linked list of struct utmp's */
struct utmplist {
  struct utmp ut;
  struct utmplist *next;
  struct utmplist *prev;
};
struct utmplist *utmplist = NULL;

/* Types of listing */
#define R_CRASH         1 /* No logout record, system boot in between */
#define R_DOWN          2 /* System brought down in decent way */
#define R_NORMAL        3 /* Normal */
#define R_NOW           4 /* Still logged in */
#define R_REBOOT        5 /* Reboot record. */
#define R_PHANTOM       6 /* No logout record but session is stale. */
#define R_TIMECHANGE    7 /* NEW_TIME or OLD_TIME */

/* Global variables */
int maxrecs = 0;        /* Maximum number of records to list. */
int recsdone = 0;       /* Number of records listed */
int showhost = 1;       /* Show hostname too? */
int altlist = 0;        /* Show hostname at the end. */
int usedns = 0;         /* Use DNS to lookup the hostname. */
int useip = 0;          /* Print IP address in number format */
int oldfmt = 0;         /* Use old libc5 format? */
char **show = NULL;     /* What do they want us to show */
char *ufile;            /* Filename of this file */
time_t lastdate;        /* Last date we've seen */
char *progname;         /* Name of this program */
#if CHOP_DOMAIN
char hostname[256];     /* For gethostbyname() */
char *domainname;       /* Our domainname. */
#endif

/*
 *      Convert old utmp format to new.
 */
void uconv(struct oldutmp *oldut, struct utmp *utn)
{
        memset(utn, 0, sizeof(struct utmp));
        utn->ut_type = oldut->ut_type;
        utn->ut_pid  = oldut->ut_pid;
        utn->ut_time = oldut->ut_oldtime;
        utn->ut_addr = oldut->ut_oldaddr;
        strncpy(utn->ut_line, oldut->ut_line, OLD_LINESIZE);
        strncpy(utn->ut_user, oldut->ut_user, OLD_NAMESIZE);
        strncpy(utn->ut_host, oldut->ut_host, OLD_HOSTSIZE);
}

#if NEW_UTMP
/*
 *      Read one utmp entry, return in new format.
 *      Automatically reposition file pointer.
 */
int uread(FILE *fp, struct utmp *u, int *quit)
{
        static int utsize;
        static char buf[UCHUNKSIZE];
        char tmp[1024];
        static off_t fpos;
        static int bpos;
        struct oldutmp uto;
        int r;
        off_t o;

        if (quit == NULL && u != NULL) {
                /*
                 *      Normal read.
                 */
                if (oldfmt) {
                        r = fread(&uto, sizeof(uto), 1, fp);
                        uconv(&uto, u);
                } else
                        r = fread(u, sizeof(struct utmp), 1, fp);
                return r;
        }

        if (u == NULL) {
                /*
                 *      Initialize and position.
                 */
                utsize = oldfmt ? sizeof(uto) : sizeof(struct utmp);
                fseeko(fp, 0, SEEK_END);
                fpos = ftello(fp);
                if (fpos == 0)
                        return 0;
                o = ((fpos - 1) / UCHUNKSIZE) * UCHUNKSIZE;
                if (fseeko(fp, o, SEEK_SET) = 0) {
                if (oldfmt)
                        uconv((struct oldutmp *)(buf + bpos), u);
                else
                        memcpy(u, buf + bpos, sizeof(struct utmp));
                return 1;
        }

        /*
         *      Oops we went "below" the buffer. We should be able to
         *      seek back UCHUNKSIZE bytes.
         */
        fpos -= UCHUNKSIZE;
        if (fpos 

    
 
 

您可能感兴趣的文章:

  • Linux shell awk提取数据
  • Shell script正则表达式提取匹配子串
  • 求shell,关于根据字符串提取不规则log日志
  • shell如何提取一个数字中的中间几位?
  • 求教一个shell脚本,字符串提取问题。
  • 提取oralce当天的alert log的shell脚本代码
  • 用shell脚本编程,怎么实现提取一个文件的一段内容,而且位置不定,行数不定
  • 请问如何用shell脚本在文件中提取出任意位置的字符串并保存到另外一个文件中。
  • 使用shell,提取每行中指定的区域
  • shell脚本提取数据求助
  • shell脚本提取文件中的字符串 急~~~
  • 如何用shell实现 删除创建时间超过指定时间的文件?
  • !!linux下文件名称以时间结尾的,如何在shell脚本中找到时间最新的那个文件?
  • 在shell中如何获取当前日期和时间
  • 写shell脚本,关于时间的小问题???
  • Shell获取系统时间问题
  • shell 脚本 date 手动执行 和 放在init.d中自动执行的时间不一样
  • 如何获取shell脚本中某条语句的执行时间
  • shell脚本里,如何获得当前时间的前1天或者前1个月的时间?
  • 请问如何在SOLARIS的SHELL中显示时间并精确到毫秒?
  • shell程序 控制时间循环 !!!!
  • 在shell编程中,怎样获取当前时间
  • shell 按当前时间作为文件名建立文件夹
  • shell脚本中,如何取当前时间作为文件夹的名称
  • shell编程:指定时间的运算
  • 我想在shell中读取时间 2004-JAN-15 用date +%b 读出为Jan 谢谢在线等
  • 请教一下,如何用shell 编程实现删除超过一定时间以前的文件?
  • 在shell中我要怎么取得其一天的时间?(在线等待)
  • 如何编程实现(不用shell命令)修改文件的时间
  • shell中如何调用时间参数
  • shell里面的时间问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 不同类型的shell*(K SHELL , C SHELL) 用命令怎么切换?
  • linux bash shell命令:grep文本搜索工具简介
  • 我在执行shell时,想在shell里直接向mysql数据库插入数据,我该如何写shell。
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 菜鸟问问题:shell是什么呢?普通的ls、cp、pwd这些命令算不算shell呢?如何把自己写的文件变成shell呢?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • 傻瓜问题,请问shell编程和shell脚本编程的关系
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • shell变量和子shell的问题请教
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 请问“当前shell”和“子shell”的区别?
  • 怎么知道当前是B_SHELL 还是C_SHELL
  • 用户登陆后运行某SHELL退出SHELL就回到LOGIN是怎么作到的?
  • oracle iis7站长之家
  • 请问一个shell中如何获取这个shell自身抛出的错误?
  • 非登录shell是什么 意思,和登录shell有什么区别啊
  • Solaris 8中修改root的shell为一个非法的Shell后怎么办?
  • 各位Shell高人,如何取得Shell的第10个入口参数?$10不行啊,急!
  • shell 编程 执行shell新建多个终端 并执行程序
  • 如何在一台机器上的shell中执行另外一台机器上的shell


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3