20145221 《信息安全系统设计基础》第1周学习总结
教材学习内容总结
Linux操作系统
- 操作系统:连接硬件与应用程序,作为计算机表里之间的桥梁,包括系统调用和内核。
- Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
- Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
- 严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
相关知识点
- linux系统->(X 窗口系统->客户端 Xclient)图形界面的套件X.org。比较:windows图形环境与内核不存在中介。
- 用户通过Shell(命令解析器)与linux系统进行交流。在图形界面下,linux利用终端模拟器程序(Terminal)来接受用户输入和显示输出。
- 注意:终端(Terminal)和控制台(Console)是有区别的。
- Linux 默认提供了 6 个纯命令行界面的 terminal来让用户登录,在物理机系统上你可以通过使用
[Ctrl]+ [Alt]+[F1]~[F6]
进行切换。
- 用户可以通过执行 man 命令调用手册页,获得某个命令的说明和使用方式的详细介绍。如:man man(获得man本身的功能介绍)。
Shell(命令解析器)
重要快捷键
Tab
:使用Tab
键来进行命令补全,当你忘记某个命令的全称时你可以只输入它的开头的一部分然后按下Tab键就可以得到提示或者帮助完成。(PS:不止补全命令,补全目录,补全命令参数都是没问题的)
Ctrl+c
:当你在 Linux 命令行中无意输入了一个不知道的命令,或者错误的使用了一个命令,导致在终端里出现了你无法预料的情况,这时候你就可以使用Ctrl+c
键来强行终止当前程序(它并不会使终端退出)。
- 其他常用快捷键:
按键 |
作用 |
Ctrl+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂定当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a |
将光标移至输入行头,相当于Home键 |
Ctrl+e |
将光标移至输入行末,相当于End键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
学会使用通配符
- 通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。
- Shell 常用通配符:
字符 |
含义 |
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} |
匹配 c1-c2 中全部字符 如{1..10} |
注意
- 终端里面输入的通配符是由 Shell 处理的,不是由所涉及到命令语句处理的,它只会出现在命令的“参数值”里(它不用在 命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种 Shell 实现的路径扩展功能。在 通配符被处理后, Shell 会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
Linux常用命令
Linux命令的格式
选项是调整命令执行行为的开关,选项不同决定了命令的显示结果不同。```
#### Linux重要命令
- ls:或```ls .```显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略。类似于Windos的cmd中的```dir```命令。另:后面可以跟参数```-a```用以显示隐藏文件,可以显示所有文件。
- man
- man是manul的缩写,我们可以通过man man来查看man的帮助
- 如看不懂英文可以考虑下载安装一个中文版本的manual
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918115658528-189943649.jpg)
- apt-get
- 用以安装Linux中没有的软件
- 命令如:```sudo apt-get install DDD```
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918115709591-499065018.jpg)
- apt-get的卸载命令是```apt-get remove```
- find
- 将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。
- find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
- -name:文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。 可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。 不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。例如:find ~ -name "*.log" -print。
- -mount, -xdev : 只检查和指定目录在同一个档案系统下的档案,避免列出其它档案系统中的档案
- -amin n : 在过去 n 分钟内被读取过
- -anewer file : 比档案 file 更晚被读取过的档案
- -atime n : 在过去 n 天过读取过的档案
- -cmin n : 在过去 n 分钟内被修改过
- -cnewer file :比档案 file 更新的档案
- -ctime n : 在过去 n 天过修改过的档案
- -empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name
- -ipath p, -path p : 路径名称符合 p 的档案,ipath 会忽略大小写
- -name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写
- -size n : 档案大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 档案类型是 c 的档案。(一块 = 512字节)
- locate
- 其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用```updatedb```命令,手动更新数据库。
- cheat
- Linux不自带cheat功能,需要下载安装,参见[Cheat—— 给Linux初学者和管理员一个终极命令行"备忘单"](https://linux.cn/article-3760-1.html)
- cheat是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。如下图,它较为方便地展现了find的相关功能:
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918115726920-14189131.jpg)
- grep
- 作用:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
- 格式:```grep [options]```
- 主要参数
- -c:只输出匹配行的计数。
- -I:不区分大 小写(只适用于单字符)。
- -h:查询多文件时不显示文件名。
- -l:查询多文件时只输出包含匹配字符的文件名。
- -n:显示匹配行及行号。
- -s:不显示不存在或无匹配文本的错误信息。
- -v:显示不包含匹配文本的所有行。
- pattern正则表达式主要参数:
- : 忽略正则表达式中特殊字符的原有含义。
- ^:匹配正则表达式的开始行。
- $: 匹配正则表达式的结束行。
- <:从匹配正则表达式的行开始。
- \>:到匹配正则表达式的行结束。
- []:单个字符,如[A]即A符合要求 。
- [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
- 。:所有的单个字符。
- * :有字符,长度可以为0。
- which
- 命令格式:
- which 可执行文件名称
- 命令功能:
- which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
- 命令参数:
- -n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
- -p 与-n参数相同,但此处的包括了文件的路径。
- -w 指定输出时栏位的宽度。
- -V 显示版本信息
- whereis
- 命令格式:
- whereis [-bmsu] [BMS 目录名 -f ] 文件名
- 命令功能:
- whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。
- 命令参数:
- -b 定位可执行文件。
- -m 定位帮助文件。
- -s 定位源代码文件。
- -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
- -B 指定搜索可执行文件的路径。
- -M 指定搜索帮助文件的路径。
- -S 指定搜索源代码文件的路径。
- 使用实例:
- 实例1:将和**文件相关的文件都查找出来
- ```whereis svn```
- 实例2:只将二进制文件 查找出来
- ```whereis -b svn```
### 环境变量与文件查找
- 使用declare命令创建一个变量名为```tmp```的变量:$ declare tmp,其实也可以不用declare预声明一个变量,直接即用即创建;使用=号赋值运算符为变量```tmp```赋值为```shiyanlou:$ tmp=shiyanlou```;读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值):```$ echo $tmp```;**关于变量名,并不是任何形式的变量名都是可用的,变量名只能是英文字母,数字或者下划线,且不能以数字作为开头。**
- ```set```:显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量;```env```:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行;```export```:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量;使用vimdiff工具比较```set```、```env```、```export```的差别:
- 关于环境变量,可以简单的理解成在当前进程的子进程是否有效,有效则为环境变量,否则不是(有些人也将所有变量统称为环境变量,只是以全局环境变量和局部环境变量进行区分,我们只要理解它们的实质区别即可);```为了与普通变量区分,通常我们习惯将环境变量名设为大写。```
- 可以使用```unset```命令删除一个环境变量。
### 文件打包和解压缩
- 使用zip打包文件夹:```zip -r -q -o shiyanlou.zip /home/shiyanlou```、```du -h shiyanlou.zip```、```file shiyanlou.zip```
- 使用```-e```参数可以创建加密压缩包:```zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou```。
- 使用unzip命令解压缩zip文件:将shiyanlou.zip解压到当前目录```unzip shiyanlou.zip```;使用安静模式,将文件解压到指定目录:```unzip -q shiyanlou.zip -d ziptest```。
### Linux文件系统操作及磁盘管理
- 使用```df```指令查看磁盘的容量,1k-blocks表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量,我们可以使用```df -h```指令能更直观的查看磁盘容量。
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918212144991-2015278657.jpg)
- 使用```du```命令查看目录的容量,加上```-h```参数,以更易读的方式展示,du(estimate file space usage)命令与df(report file system disk space usage)只用一字只差,首先就希望注意不要弄混淆了,可以从man手册中获取命令的完整描述,记全称就不会搞混了。
- ```dd命令```用于转换和复制文件,不过它的复制不同于```cp```,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。```dd程序```也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。
- dd的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为```选项=值```,而不是更标准的```--选项 值```或```-选项=值```。```dd```默认从标准输入中读取,并写入到标准输出中,但可以用选项```if```(input file,输入文件)和```of```(output file,输出文件)改变。
## 教材学习中的问题和解决过程
### cheat无法安装
- 参照教程所示,但是在运行```python setup.py install```,如下图:
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918115743703-1712204040.jpg)
- 解决办法:在看了“错误提示”后,发现可能是由于权限的问题不让安装这个python脚本,所以我将上述的指令改为```sudo python setup.py install```,果然安装成功。
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918115755516-168213112.jpg)
### apt-get与apt有什么区别
- 这个问题暂时没解决
- 每当我要用到某个指令而Linux中没有安装时,终端给我的提示是用```sudo apt install XXX```,而不是```sudo apt-get install XXX```
- 我上网查了查,也只查到了```apt-get```与```yum```的区别:apt-get主要用于Debian系列包括现在比较流行的Ubuntu中,适用于deb包;yum主要用于RedHat系列包括 Fedora等发行版的Linux系统上,适用于rpm包
- 常用的与apt-get有关的指令:
- 软件安装:```apt-get install packagename```
- 软件卸载(删除配置文档):```apt-get remove (--purge) packagename```
## 代码调试中的问题和解决过程
- 本周除了基本的指令外,暂无代码编写
- 如遇指令忘记,可用```Tab```键联想补全,如不知道具体文件名,则可以用正则表达式进行匹配
## 课后作业中的问题和解决过程
- 请在虚拟机中安装DDD软件(其他软件)
- 应用前文中提到的安装指令即可安装
- 请演示怎么判断DDD软件能不能安装
- 安装软件,需要下载好应用,所以没有网的时候,是不能进行软件安装的
- 请查找系统中50M以上的文件
- find指令的简单应用,查看前述的find指令即可
- 请查找系统中两天前修改过的且小于5M的文件
- ```find . -size -5M -type f -mtime +2```
- 请问如何查找操作系统的信息
- 直接使用```top```指令即可
- 或者可以用``` cat /etc/issue```看到Linux版本信息
- 请查找当前目录下所有*.c文件中哪个文件中包含main函数
- ```grep main *.c```
- 请建立一个目录,里面建立两个子文目录,如何一条命令删除三个目录?
- ```mkdir -p Linux/{1,2}```
![](http://images2015.cnblogs.com/blog/877163/201609/877163-20160918212132318-1327512025.jpg)
- 删除三个目录:```rm -r Linux/{1..3}```
- 如何把一个目录及子目录拷贝到自己的主目录中
- ```cp -r 待复制目录 主目录```
## 本周代码托管截图
- 本周暂无代码
## 其他(感悟、思考等,可选)
- 这周的学习任务主要集中于实验楼[ Linux 基础入门(新版)](https://www.shiyanlou.com/courses/1)的学习,虽然任务量有点大,但是单个指令实现起来还是较为容易的。我觉得关键还是要多运用,只有经常运用这些指令,才能熟悉他们,特别是指令后面经常跟着许多参数选项,这些内容死记是不行的,也是没有意义的,要将其应用的实践中,才是掌握指令的最佳方法。
- 这周的学习材料主要集中于网络,实验楼的学习让我感触很深,既可以看到电子版的文档(方便整理与下载),也可以在左边栏的虚拟机中进行同步模拟,就像老师一边在讲台上传授新知识,我们一边练习一样。
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |