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

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

教材学习内容总结

参见第九周学习总结博客:(http://www.cnblogs.com/xzh20145231/p/6059414.html)

实践学习总结

通过看视频对Linux中的重要命令再次进行了学习:

视频知识总结

目录 ls

功能:列出目录内容,显示文件信息

ls -l:显示当前工作目录下包含目录及属性详细信息(共7列)

第一列:文件属性(类—文件-目录)


二到四位:文件创建者权限(-代表无权限,r代表读权限,w代表写权限,x代表执行权限)

五到七位:代表同组用户权限

八到十位:其他用户权限(具有读和其他权限,没有写权限)

第二列:文件子目录数(字段数至少为2)

第三列:所有者

第四列:所属用户组

第五列:文件大小

第六列:文件最后修改时间

第七列:文件名

man ls 查看ls的具体命令功能

如何编写ls

如何列出目录内容(目录树:只有文件和目录两种情况)

如何读取文件属性

如何判断目录名与文件名

   什么是目录:目录是一种特殊的文件,它的内容是文件和目录的名字

    目录文件永远不会空,每个目录都有至少两个特殊的项“."(当前目录)和:".."(上一级目录)

是用什么系统项读取目录调用:man -k directory|grep read

输入命令:man 3 read directory可以看到详细信息(查看其数据结构,name保存其文件名)

see also :closedir(3) opendir(3)

man opendirz(3)

自己编程实现:

 main

 opendir
 while(readdir)
 print d_name
 closedir

自己编程实现可能遇到的问题及解决方法:(与系统中的ls命令相比)

排序:

文件名读入数组

qsort()排序

分栏:

文件名读入数组

计算列宽和行数

.和..

加入-a选项

没有-a,不显示隐藏文件

-l(会显示详细信息)

功能不同

单独实现

如何读取文件属性

man 2 stat查看stat结构体的详细信息

st_size:所占字节数

st_nlink:文件链接数

st_mtime:文件最后修改时间(time_t->ctime日历时间格式)

st_mode:文件类型和许可权限(模式转化为字符 user group other)

与0 置为0、与1 取出相应位

使用八进制的原因:权限读写是三为一组

使用掩码(通过宏定义来判断用途),通过grep查看宏是如何定义的;

用户ID转换为用户名:如图

实践内容

man who查看who功能:

who命令参数:

-a 打印能打印的全部

-d打印死掉的进程

-m 同am i,mom likes

-q 打印当前登录用户数及用户名

-u 打印当前登录用户登录信息

-r 打印运行等级

通过whatis who或man -f who直接运行命令,可以了解who的大致功能,要进一步了解who的用法,需要借助联机帮助manpages:

代码调试

代码cp1.c

进行复制文件的操作,需要有源文件和目的文件

代码fileinfo.c

用来实现显示文件信息。先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息,报错就用perror将报错信息打印出来。

同样需要输入要查看的文件才会有信息打印出来

代码filesize.c

原本的代码是指定查找etc/passwd文件的大小,所以后面输入什么文件名都是一样的大小

代码ls1.c

简单的显示所在文件夹中的文件及文件夹列表

代码ls2.c

显示所在文件夹中的文件及文件夹详细信息的列表

代码setecho.c

可以改变符号显示状态,no是不显示符号,yes是显示
可以看到no指令后输入的命令看不见,状态值为0;yes指令后恢复可见,状值态为1.

代码echostate.c

用来检查命令行中的提示符是否显示的,如果显示,输入的命令都可见,不显示则表示输入的命令不可见

代码spwd.c

显示出所在目录

代码testioctl.c

计算当前命令行窗口的行列数大小

代码who1.c

从UTMP_FILE文件中读取系统中用户信息

补充

重新使用gcc进行编译,将目标文件放到bin目录下:

代码分析 以实现who命令的代码为例

参考:(http://www.cnblogs.com/rocedu/p/6016880.html)

首先使用whatis who以及man -f who查看who命令功能;

更进一步了解其详细功能:通过联机帮助manpages,man 1 who进行查看(每一节对应编号不同、功能不同),在查看实现who的程序之前,可以通过manpages中的详细信息先对实现who的系统调用的相关资料进行了解;(帮助文档上通常有关键信息)

我们发现关键信息/var/run/utmp,却对其作用功能一无所知,于是学会利用ls /var/run/utmp以及file /var/run/utmp查看其是否存在以及文件类型;

然后可以看看文件uptm中的内容cat /var/run/utmp,是乱码,可确定这是一个二进制文件,利用od -tx1 /var/run/utmp按字节查看二进制文件内容,其呈现出一定规律:由一条条记录组成;

再使用帮助文档对其功能进行查看分析man -k utmp,结果证明它确实由一条条记录组成,随即man 5 utmp

从以上的说明可以知道utmp这个文件里面保存的是结构体数组,数组元素是utmp类型的结构,utmp结构保存了登录记录。它包含9个成员变量,ut_user 数组保存登录名,ut_line 数组保存设备名,也就是用户的终端类型,ut_time 保存登录时间。 utmp这个结构所包含的其他成员没有被who命令所用到。

我们在utmp.h中应该能找到utmp类型的定义,Linux中的头文件都在/usr/include目录里。通过grep -nr "struct utmp" /usr/include能快速找到struct utmp在哪个头文件中定义;

然后是比较有挑战性的一个问题:自己编写代码实现who命令功能:

1.伪代码:打开utmp 文件;读取utmp中的每一条记录;显示记录中的相关信息;关闭utmp文件;

2.读取文件相关的系统调用,还是通过man -k read | grep file | grep 2查找相关信息,符合的再用man 2 read查看,在SEE ALSO中看到文件操作的其他相关调用,如:open(2)也可以进行查看;

3.了解了相关方法之后可以试着用C语言编程实现,使用了老师给的参考代码,运行结果如下:

结果比起系统的who命令,功能还是有所差距

4.完善代码功能,消除空白行(不能只过滤用户名为空的情况,要指出某一条记录确实对应着已登录的用户。),显示日历格式的时间;

编译报错,根据提示再次修改代码

5.能够实现以上功能。

感悟

通过以上对who命令的分析,最大的收获是意识到查帮助文档的重要性!只有通过查帮助文档才能将一条命令的学习层层深入,由了解功能到自己编程实现功能,对于查看帮助文档时不懂的条目不要放弃,继续查找该条目的信息,最后将这些信息联系起来,就会恍然大悟(可以写出伪代码),而之前所强调的man key1|grep key2|grep key3以及grep -nr xxx/usr/include都是查看不同信息的方式,是深入学习一种命令的手段。此次只是深入分析代码的一次实践,但是从中掌握了基本的分析思路,在今后自我学习命令使用过程中不至于没有头绪,无从下手。

学习过程中的问题和解决过程

实践中遇到的问题

代码托管截图

代码统计:

![博客链接](https://git.oschina.net/xzhkuma1128/CSAPP2E)

心得体会

做中学,少说多做。

学习进度条

博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 30篇 400小时
第一周 1/1 20/20 学习了Linux核心命令
第二周 1/2 21/41 学习了vim、gcc、gdb指令
第三周 1/3 20/61 学习了信息的表示和处理,了解了二进制在计算机系统中的重要性
第五周 1/4 20/81 学习了机器级程序,读懂汇编代码
第六周 1/5 19/100 了解了处理器对于指令的处理过程
第七周 1/6 18/118 了解了存储器层次结构及存储技术
第八周 2/8 15/133 对前几周内容进行复习
第十周 3/12 10/148 学习Linux重要命令
posted on 2016-11-20 23:20  xzhkuma  阅读(222)  评论(4编辑  收藏  举报