《信息安全系统设计基础》第九周学习总结
这周由于自己的原因,周五离校,现在刚站脚,到周一上午可能都会有点事,小小事。但是一定不会耽误考试。东西写得匆忙,见谅,周一我在完善。
上一篇链接:http://www.cnblogs.com/20145207lza/p/6052573.html
1. who
who命令是查询当前登录的每个用户,输出包括用户名、终端类型、登录日期及远程主机。
man一下who,可以看到,who命令是读取/var/run/utmp文件来得到信息的。
man一下utmp,知道utmp这个文件,是二进制文件,里面保存的是结构体数组,这些数组是struct utmp结构体的。
伪代码
- 打开记录所在文件:utmp
- 将文件中的记录逐条读取
- 每一条读取的记录都要在屏幕上打印
- 关闭文件
问题
解决对齐问题:
- 对齐的问题很好解决。我使用的是\t制表符来排的,但是由于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]!='\0');
printf("\t(%s)",record.ut_host);
printf("\n");
}
}
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.setecho与echostate
- setecho用来改变输入指令是否可见。
- 输入y(或是以y开头的一串字符),命令可见
否则(即输入不以y开头的字符),命令不可见
- echostate显示输入命令是否可见。
- echo is on:命令可见
echo is off:命令不可见