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重要命令 |