Chinaunix首页 | 论坛 | 博客
  • 博客访问: 576552
  • 博文数量: 99
  • 博客积分: 3976
  • 博客等级: 中校
  • 技术积分: 1041
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-15 15:48
文章分类
文章存档

2009年(1)

2008年(5)

2007年(31)

2006年(58)

2005年(4)

分类: LINUX

2006-11-02 09:35:56

  其实在Linux下想看到谁登陆在自己的机器上,用w或者who命令即可查看,(如图一)

图一

从图一中可以看出有4个人在使用当前这台Linuxwhow命令可以作到,如果想知道如何使用who命令或者w,可以查看手册(即manmanual的缩写,使用手册,man也是一个命令。我们可以通过man来查看很多信息,例如查看printf的信息,可以输入man printf,就可以查看prinf的信息,当然,前提是printf在系统中有手册。Man还分各种章节,例如man 1 printf是查看用户工具 man 2 write是查看系统调用,man 3printf是查看C函数库调用,4是查看设备驱动程序信息,5是查看配置文件,6是查看游戏,7是查看软件包,8是查看系统工具。如果想对man有更多的了解,还可以输入命令#man man来获得):

[root@localhost root]#man w    (查看w命令的手册)

[root@localhost root]#man who    (查看who命令的手册)

这样就可以得到相应的信息(如图二)

图二

  下面介绍一下如何编写这样的程序,通过查看who的命令文档可以查看到登陆用的信息被记录到了/var/run/utmp/var/log/wtmp文件中,关于相关的结构可以在/usr/include/utmp.h下查看,在该文件中包含了一个头文件#include ,这个文件中有具体的utmp结构,下面来看一看bits/utmp.h文件的相关部分:

 

struct utmp

{

  short int ut_type;              /* 登陆的类型(在后面会列出相应的类型).  */

  pid_t ut_pid;                     /*登陆的进程ID  */

  char ut_line[UT_LINESIZE];    /* 设备名,也就是我们说的TTY的名  */

  char ut_id[4];            /* Inittab ID.  */

  char ut_user[UT_NAMESIZE]; /* Username.  */

  char ut_host[UT_HOSTSIZE];  /* 登陆人的主机名.  */

  struct exit_status ut_exit;   /* 登出信息,例如死机等*/

#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32

  int32_t ut_session;            /* 会话ID */

  struct

  {

    int32_t tv_sec;              /* .  */

    int32_t tv_usec;            /*微秒 */

  } ut_tv;                     /* 时间的结构名 */

#else

  long int ut_session;           /* 会话ID  */

  struct timeval ut_tv;          /* 登陆时间 */

#endif

 

  int32_t ut_addr_v6[4];       /* 登陆者的主机.  */

  char __unused[20];           /* Reserved for future use.  */

};

 

结构中包含了登陆的类型,拥护名,主机名,登陆时间,登陆的控制台等等!下面再来看一看登陆类型的结构:

 

#define EMPTY            0     /*没有任何信息的类型  */

 

#define RUN_LVL         1     /* 系统运行的级别的类型  */

#define BOOT_TIME    2     /* 系统引导的类型  */

#define NEW_TIME      3     /* 系统时间更改后的类型  */

#define OLD_TIME       4     /* 正在更改的时间的类型.  */

 

#define INIT_PROCESS       5     /* 初始化进程的类型.  */

#define LOGIN_PROCESS   6     /* 正在等待或者验证登陆的类型  */

#define USER_PROCESS      7     /* 已经登陆的用户(本文主要用的是这个) */

#define DEAD_PROCESS     8     /* 退出(登出)的类型 */

 

类型分别为空,runlevelrebootnewtimeoldtimeinitprocesslogin,用户等等,本文主要介绍的是USER_PROCESS这一项。如果要记录用户登陆的时间的话,当然就要用到时间的函数,也就是ctime函数,函数从/usr/include/time.h里面可以找到:

extern char *ctime (__const time_t *__timer) __THROW;

主要的操作还是打开文件和读取文件,也就是openread函数,打开的文件是/var/run/utmp。在/usr/include/paths.h里面有定义。同时也可以查看到各种路径的定义。

  下面开始编写简单的程序:

#include

#include

#include

#include

#include

 

void Timeformat(long timearg)

{

    char *p;    /*声明一个指针变量,在后面用来存放时间的地址*/

    p=ctime(&timearg); /*格式化时间*/

    printf("%12.12s\n", p+4); /*ctime返回的字符串从第四个字符开始*/

}

/*以上为格式化输出时间*/

void Showmessage(struct utmp * utmparg)

{

  

   if(utmparg->ut_type != USER_PROCESS)/*判断登陆类型时候是“用户”*/

   return;

   printf("灵鸠剑客 give you the who message\nthe program written by 灵鸠剑客\n");

   printf("%-8.8s", utmparg->ut_name ); /*输出登陆的用户名*/

   printf(" ");

   printf("%-8.8s",utmparg->ut_line); /*输出登陆的TTY*/

   printf(" ");

   Timeformat(utmparg->ut_time); /*输出登陆的时间*/

 

}

 

/*以上为输出当我们输入who命令后输出的信息*/

int main()

{

    struct utmp pointer;   /*声明utmp结构变量*/

    int utmpfd;  /*打开的utmp文件存放在这里*/

    int re=sizeof(pointer);

   

    if((utmpfd = open(UTMP_FILE, O_RDONLY)) == 1){/*打开utmp文件,前面说过UTMP_FILE文件在paths.h中有定义*/

    printf("error\n");

    exit(1);

    }

 

    while( read(utmpfd, &pointer, re) == re)/*读取文件中的内容*/

    Showmessage(&pointer); /*调用Showmessage函数*/

    close(utmpfd); /*关闭utmp文件*/

    return 0;

}

下面来运行一下我们自己写的who程序看一看。(如图三)

 

  关于who程序的编写到这里就结束了,虽然本文没有介绍w的编写,但是w的编写可以根据上面的代码自己进行修改即可!who命令虽然简单,但是他却可以查看谁在使用这台Linux

 

 

阅读(1157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~