20199128《网络攻防实践》假期作业
这个作业属于哪个课程 | 《网络攻防实践》 |
这个作业的要求在哪里 | 《网络攻防实践》假期作业 |
我在这个课程的目标是 | 掌握网络攻防基础知识,提高网络攻防实践能力 |
这个作业在哪个具体方面帮助我实现目标 | 复习了linux基本操作并学习了Markdown的使用 |
作业正文.... | 见作业一、二 |
其他参考文献 | 见参考文献 |
作业一
(1)你对网络攻击和防御了解多少?该课程需要计算机和网络相关的基础知识,你原专业是什么专业,目前你掌握多少基础知识?
了解拒绝服务攻击、注入、泛洪攻击等基础知识;原专业为计算机科学与技术;本科期间学习过《计算机网络》等课程,了解一定的网络基础知识。
(2)作业要使用Markdown格式,Markdown入门参考(需掌握)
已进行Markdown格式的相关学习,初步掌握Markdown。
作业二
你自己动手安装过操作系统吗?如果没有话现在动手学一下吧。
(1)学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统(也可以使用VMWare安装虚拟机,安装方法自己百度)
此前已通过VMWare安装过Ubuntu的Linux操作系统。
(2)通过实践学习别出心裁的Linux命令学习法,掌握Linux命令的学习方法
ls命令
ls命令用来查看当前目录下的所有目录和文件。
ls -a命令可以查看当前目录下的所有目录和文件(包括隐藏的文件)。
man命令
我们可以通过使用man命令来获得某个命令的说明和使用方式的详细介绍。
man printf和man 1 printf
man手册的内容很多,为了便于查找,man手册被进行了分册(分区段)处理,在Linux中,手册通常分为八个区段,即
区段 | 说明 |
---|---|
1 | 一般命令 |
2 | 系统调用 |
3 | 库函数,包含C标准函数库 |
4 | 特殊文件(通常是/dev中的设备)和驱动程序 |
5 | 文件格式和约定 |
6 | 游戏和屏保 |
7 | 杂项 |
8 | 系统管理命令和守护进程 |
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可。
man 3 printf
将man后面的1改为3后,则会显示第三区段中printf命令man页面。
man -k sort
-k选项是man命令的常用选项,其功能同命令apropos相同,将会搜索whatis数据库,模糊查找关键字。
(3)参考上面的学习方法通过实践学习Linux 基础入门(新版)课程,掌握常用的Linux命令,重点是3/4/5/6/7/8节。
创建用户
创建用户组并将新用户添加到用户组
可以使用 usermod 命令为用户添加用户组,使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。
新建的july用户没有相应权限,所以出现了图示问题:
按照博客xxx is not in the sudoers file.This incident will be reported.的解决方法所述
首先切换到root用户下:
如图所示,多次输入密码,均Authentication failure,经查询,可能是刚安装好的Linux系统,没有给root设置密码。
于是给root用户设置密码:
其中在编辑sudoers文件时在root ALL = (ALL:ALL)ALL下添加july ALL = (ALL)ALL。
此处在编辑sudoers文件时有四种添加形式:
格式 | 说明 |
---|---|
july ALL=(ALL) ALL | 允许用户july执行sudo命令(需要输入密码) |
%july ALL=(ALL) ALL | 允许用户组july里面的用户执行sudo命令(需要输入密码) |
july ALL=(ALL) NOPASSWD: ALL | 允许用户july执行sudo命令,并且在执行的时候不输入密码 |
%july ALL=(ALL) NOPASSWD: ALL | 允许用户组july里面的用户执行sudo命令,并且在执行的时候不输入密码 |
/etc/group 文件格式说明
/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:
group_name:password:GID:user_list
如果用户的 GID 等于用户组的 GID,那么最后一个字段 user_list 就是空的。
查看文件权限
变更文件所有者
修改文件权限
方法一:
其中,g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。
adduser 和 useradd 的区别是什么?
答:useradd 只创建用户,创建完了用 passwd lilei 去设置新用户的密码。adduser 会创建用户,创建目录,创建密码(提示你设置),做这一系列的操作。其实 useradd、userdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作。
添加一个用户 loutest,使用 sudo 创建文件 /opt/forloutest,设置成用户 loutest 可以读写
linux目录结构
目录路径
新建文件与目录
关于touch 命令,其主要作用是来更改已有文件的时间戳。
而使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。
mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录。
复制文件与目录
cp命令用于文件的复制,添加-r/R属性可以复制指定目录,包含其下所有文件和子目录。
删除文件与目录
rm命令可以删除文件,添加-f选项可以忽略提示强制删除,添加-r可以删除指定目录及其下所有文件及子目录。
移动文件
使用mv命令移动文件即剪切,同时可以以
mv 旧的文件名 新的文件名
的格式重命名文件。
批量重命名
rename可以实现批量重命名,但要注意其参数为正则表达式。
查看文件
有多种命令可用于查看文件。cat和tac命令都是用来打印文件内容到标准输出(终端),前者为正序显示,后者为倒序显示。
-b : 指定添加行号的方式,主要有两种:
-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
-b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:在行号字段最左端显示
-n rn:在行号字段最右边显示,且不加 0
-n rz:在行号字段最右边显示,且加 0
-w : 行号字段占用的位数(默认为 6 位)
打开后默认只显示一屏内容,终端底部显示当前阅读的进度。可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。
使用 head 和 tail 命令查看文件的前几行或尾几行。
tail的-f属性十分强大可以不停地读取某个文件的内容并显示,让我们动态查看日志,以达到实时监视的目的。
查看文件类型
创建一个 homework 目录,建立名为 1.txt~10.txt 文件,并删除 1.txt~5.txt 。
Linux 的日志文件在哪个目录?
答:/var/log
创建变量
环境变量
通常我们会涉及到的变量类型有三种:
- 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
也有三个与上述三种环境变量相关的命令:set,env,export。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。详见下表:
命令 | 说明 |
---|---|
set | 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。 |
env | 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。 |
export | 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。 |
创建Shell脚本
创建C语言程序
添加路径至环境变量
注意:使用绝对路径!!!
在每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是 .zshrc。
命令中 >> 表示将标准输出以追加的方式重定向到一个文件中,而前面用到的 > 是以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。
变量修改
变量设置方式 | 说明 |
---|---|
${变量名#匹配字串} | 从头向后开始匹配,删除符合匹配字串的最短数据 |
${变量名##匹配字串} | 从头向后开始匹配,删除符合匹配字串的最长数据 |
${变量名%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最短数据 |
${变量名%%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} | 将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的字串} | 将符合旧字串的全部字串替换为新的字串 |
删除变量
环境变量立即生效
前面在 Shell 中修改一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,所以我们可以使用 source 命令来让其立即生效。source 命令还有一个别名就是 .,所以下图两条命令效果是相同的。
搜索文件
- where的搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用 locate 命令。
- locate通过“ /var/lib/mlocate/mlocate.db ”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令。
- which本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令。
- find不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
找出 /etc/ 目录下的所有以 .list 结尾的文件
压缩文件类型
文件后缀名 | 说明 |
---|---|
*.zip | zip 程序打包压缩的文件 |
*.rar | rar 程序压缩的文件 |
*.7z | 7zip 程序压缩的文件 |
*.tar | tar 程序打包,未压缩的文件 |
*.gz | gzip 程序(GNU zip)压缩的文件 |
*.xz | xz 程序压缩的文件 |
*.bz2 | bzip2 程序压缩的文件 |
*.tar.gz | tar 打包,gzip 程序压缩的文件 |
*.tar.xz | tar 打包,xz 程序压缩的文件 |
*tar.bz2 | tar 打包,bzip2 程序压缩的文件 |
*.tar.7z | tar 打包,7z 程序压缩的文件 |
zip压缩打包
-r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。
设置压缩级别为 9 和 1(9 最大,1 最小):
数字越小压缩速度越快,数字越大体积越小。
注意:此处只能使用绝对路径。
用 du 命令查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小。-h表示人类可读,-d表示查看文件深度。
创建加密zip包
解密zip包
解压到当前目录:
上述指定目录不存在,将会自动创建。如果你不想解压只想查看压缩包的内容你可以使用 -l 参数。
tar打包
建包及解包一个文件(-x 参数)到指定路径的已存在目录(-C 参数):
上面命令中,-P 保留绝对路径符,-c 表示创建一个 tar 包文件,-f 用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后。还可以加上 -v 参数以可视的的方式输出打包的文件。
只查看不解包文件要使用 -t 参数。
保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性(-p 参数)和备份链接指向的源文件而不是链接本身(-h 参数)。
若要使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可。
压缩文件格式 | 参数 |
---|---|
*.tar.gz | -z |
*.tar.xz | -J |
*tar.bz2 | -j |
创建一个名为 test 的文件,分别用 zip 和 tar 打包成压缩包,再解压到 /home/shiyanlou 目录
使用 df 命令查看磁盘的容量
使用du命令查看目录容量
-h同--human-readable 以K,M,G为单位,提高信息的可读性。
-s同--summarize 仅显示总计,只列出最后加总的值。
dd命令简介
上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如'K','M','G'等单位),count用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用du和cat命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。
将输出的英文字符转换为大写再写入文件:
使用 dd 命令创建虚拟镜像文件
使用 mkfs 命令格式化磁盘
实际上mkfs.ext4 是使用 mke2fs 来完成格式化工作的。
查看Linux 支持哪些文件系统:
使用 mount 命令挂载磁盘到目录树
查看下主机已经挂载的文件系统:
输出的结果中每一行表示一个设备或虚拟设备,每一行最前面是设备名,然后是 on 后面是挂载点,type 后面表示文件系统类型,再后面是挂载选项(比如可以在挂载时设定以只读方式挂载等等)。
第一行命令挂载创建的虚拟磁盘镜像到/mnt目录,提示需要root用户权限,第二行命令添加了sudo所以成功挂载,第三行命令意在以只读方式挂载,提示virtual.img已经挂载过了。
使用 umount 命令卸载已挂载磁盘:
关于 loop 设备
在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。
使用 fdisk 为磁盘分区
操作 | 说明 |
---|---|
a | toggle a bootable flag #设置可启动标记 |
b | edit bsd disklabel #设置一个bsd磁盘标记 |
c | toggle the dos compatibility flag #设置dos兼容标记 |
d | delete a partition #删除分区 |
g | create a new empty GPT partition table #新建一个空的GPT分区表 |
G | create an IRIX (SGI) partition table #新建一个SGI分区表 |
l | list known partition types #显示分区类型,以供我们设置相应分区的类型 |
m | print this menu #显示菜单帮助信息 |
n | add a new partition #新建分区 |
o | create a new empty DOS partition table #新建一个空的DOS分区表 |
p | print the partition table #显示分区信息 |
q | quit without saving changes #不保存退出 |
s | create a new empty Sun disklabel #创建一个空的SUN磁盘标签 |
t | change a partition's system id #修改分区ID |
u | change display/entry units |
v | verify the partition table #进行分区检查 |
w | write table to disk and exit #把分区表写入硬盘并退出 |
x | extra functionality (experts only) #扩展应用,专家功能 |
创建一个 30M 的主分区,剩余部分为扩展分区:
使用 losetup 命令建立镜像与回环设备的关联
安装kpartx工具
安装kpartx是为各分区建立虚拟设备的映射。
图中问题是没有建立镜像与回环设备的关联,下图为建立关联后的运行结果:
使用mkfs格式化各分区
格式化完成后在/media目录下新建四个空目录用于挂载虚拟磁盘。
使用df -h 查看磁盘容量
卸载磁盘分区
解除设备关联
小明在管理服务器的时候发现空间不足了,他找到了一个目录,这个目录占用的空间异常的大,他需要找到这个目录中占用最大的前10个文件,但是这个目录下面的内容太多了,或许一条命令就能够帮助到他,这条命令该怎么写呢?
内建命令与外建命令
内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
得到这样的结果说明是内建命令,正如上文所说内建命令都是在 bash 源码中的 builtins 的.def中
xxx is a shell builtin
得到这样的结果说明是外部命令,正如上文所说,外部命令在/usr/bin or /usr/sbin等等中
xxx is /usr/bin/xxx
若是得到alias的结果,说明该指令为命令别名所设定的名称;
xxx is an alias for xx --xxx
help命令
当我们输入help ls希望可以得到ls的帮助信息,但却并没有得到我们想要的结果,这是因为 help 命令只能用于显示内建命令的帮助信息,而外部命令基本上都有一个参数--help,可以得到相应的帮助。
man命令
输入man ls即可得到图示信息:
参考文献
[1] Linux man 命令详细介绍
[2] xxx is not in the sudoers file.This incident will be reported.的解决方法
[3] Linux——vi命令详解