《信息安全系统设计基础》第九周学习总结

这周由于自己的原因,周五离校,现在刚站脚,到周一上午可能都会有点事,小小事。但是一定不会耽误考试。东西写得匆忙,见谅,周一我在完善。

上一篇链接:http://www.cnblogs.com/20145207lza/p/6052573.html

1.  who

who命令是查询当前登录的每个用户,输出包括用户名、终端类型、登录日期及远程主机。

man一下who,可以看到,who命令是读取/var/run/utmp文件来得到信息的。

man一下utmp,知道utmp这个文件,是二进制文件,里面保存的是结构体数组,这些数组是struct utmp结构体的。

伪代码

- 打开记录所在文件:utmp

- 将文件中的记录逐条读取

- 每一条读取的记录都要在屏幕上打印

- 关闭文件

问题

解决对齐问题:

  • 对齐的问题很好解决。我使用的是 制表符来排的,但是由于user的长度不一,导致错位,可以换成固定长度,不足补0的方法显示。

                       

解决时间显示问题:

  • 使用man查找与time格式化相关(这一部分改了好久,最后还是去网上搜索的编写who的相关内容、time的相关内容才得以解决)
  • 判断应该是strftime,进入查看用法,继续修改try_who代码

 

  • 这个警告应该是64位机的问题,运行之后和第一次的问题一样显示核心已转储,但是我到现在都不知道怎么在原句上解决。

 

解决显示记录多的问题:

  • 问题原因:utmp中保存的用户,不仅仅是已经登陆的用户,还有系统的其他服务所需要的,所以在显出所有登陆用户的时候,应该过滤掉其他用户,只保留登陆用户。在utmp结构中的ut_type可以区别,登陆用户的ut_type是USER_PROCESS。

改进

  • 在打开和关闭文件的时候加上失败情况处理。

我的代码

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h> //read

#include <sys/types.h>  //open

#include <sys/stat.h>

#include <fcntl.h>

#include <utmp.h>   //utmp

#include <time.h>   //strftime

int main()

{

    struct utmp record;

    int fd;

    int len = sizeof(record);

    struct tm *p;

    time_t t;

    char fortime[40];

    if ( (fd = open(UTMP_FILE, O_RDONLY)) == -1 )

    {

        perror( UTMP_FILE );   

        exit(1);

    }

    while(read(fd,&record,len))

    {

        if(record.ut_type == USER_PROCESS)

        {

            printf("%-10.10s",record.ut_user);

            printf("%-10.10s",record.ut_line);

            t = record.ut_time;    

            p = localtime(&t);

            strftime(fortime,40,"%F %R",p);

            printf("%12s",fortime);

            if(record.ut_host[0]!='');

                printf(" (%s)",record.ut_host);

            printf(" ");

        }

    }

   

    if (close(fd) == -1)

    {

        perror( UTMP_FILE );   

        exit(1);

    }

    return 0;

}

2.fileinfo

  • 这个功能用来实现显示文件信息

mode:st_mode        文件的类型和存取的权限        

links:st_nlink      连到该文件的硬链接数目,刚建立的文件值为1

user:st_uid         用户ID

group:st_gid        组ID         

size:st_size        文件字节数

modtime:st_mtime    最后一次修改时间

name:               输入的文件名

3.setechoechostate

  • setecho用来改变输入指令是否可见。
  • 输入y(或是以y开头的一串字符),命令可见

否则(即输入不以y开头的字符),命令不可见

  • echostate显示输入命令是否可见。
  • echo is on:命令可见

echo is off:命令不可见

原文地址:https://www.cnblogs.com/20145207lza/p/6056976.html