zoukankan      html  css  js  c++  java
  • 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重要命令
  • 相关阅读:
    @Value注释失效
    405不支持post请求
    AutoComplete="off"取消input记住之前输入过的内容
    maven解决架包冲突
    HTTP请求中 request payload 和 formData 区别?
    图片视频预览直接将请求下载的url(返回为流)操作和显示
    vue标签属性拼接变量的写法
    计算机中丢失MSVCP120.dll,Photoshopcc2017无法启动(免安装,绿色版本)
    element--循环多个表单,保存和重置怎么办?
    vue---局部刷新和刷新页面的
  • 原文地址:https://www.cnblogs.com/xzh20145231/p/6083979.html
Copyright © 2011-2022 走看看