20169215《网络攻防》第一周作业
Linux基础知识学习
之前学习的内容
Linux下的帮助命令
内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,并由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
help 命令是用于显示 shell 内建命令的简要帮助信息,帮助信息中显示有该命令的简要说明以及一些参数的使用以及说明, help 命令只能用于显示内建命令的帮助信息!
man 工具是显示系统手册页中的内容,没有内建与外部命令的区分。
简单数据流重定向
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。Linux把所有设备都视为文件,标准输入输出也是,都有各自的文件描述符:
文件描述符 | 设备文件 | 说明 |
---|---|---|
0 | /dev/stdin | 标准输入 |
1 | /dev/stdout | 标准输出 |
2 | /dev/stderr | 标准错误 |
默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出。 | ||
将cat的连续输出(heredoc方式)重定向到一个文件: |
$ mkdir Documents
$ cat > Documents/test.c <<EOF
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
EOF
将一个文件作为命令的输入,标准输出作为命令的输出:
$ cat Documents/test.c
将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出:
$ echo 'hi' | cat
将echo命令的输出从默认的标准输出重定向到一个普通文件:
$ echo 'hello shiyanlou' > redirect
$ cat redirect
grep模式匹配命令
grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件,可以实现很复杂却很高效的匹配和查找。grep支持三种正则表达式引擎,分别用三个参数指定:
- -E POSIX扩展正则表达式,ERE
- -G POSIX基本正则表达式,BRE
- -P Perl正则表达式,PCRE
grep命令常用参数:
- -b 将二进制文件作为文本来进行匹配
- -c 统计以模式匹配的数目
- -i 忽略大小写
- -n 显示匹配文本所在行的行号
- -v 反选,输出不匹配行的内容
- -r 递归匹配查找
- -A n n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行
- -B n n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行
- --color=auto 将输出中的匹配项设置为自动颜色显示
下面举例说明使用基本正则表达式
# 将匹配以'z'开头以'o'结尾的所有字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 将匹配以'z'开头,以任意多个'o'结尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'
# grep默认是区分大小写的,这里将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[a-z]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[0-9]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'
软件安装
apt-get
使用各用于处理apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,下面列出一些apt-get
包含的常用的一些工具:
工具 | 说明 |
---|---|
install | 其后加上软件包名,用于安装一个软件包 |
update | 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表 |
upgrade | 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update |
dist-upgrade | 解决依赖关系并升级(存在一定危险性) |
remove | 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件 |
autoremove | 移除之前被其他软件包依赖,但现在不再被使用的软件包 |
purge | 与remove相同,但会完全移除软件包,包含其配置文件 |
clean | 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/ |
autoclean | 移除已安装的软件的旧版本软件包 |
进程查看
top 工具是我们常用的一个查看工具,他能实时的查看我们系统的关键一些关键信息的变化已经进程在进程中的实时变化。
ps 也是我们最常用的查看进程的工具,是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等(ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令)。使用方式是ps [options] [--help]
,参数:
- -A 显示所有进程(等价于-e)(utility)
- -a 显示一个终端的所有进程,除了会话引线
- -N 忽略选择。
- -d 显示所有进程,但省略所有的会话引线(utility)
- -x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
- -p pid 进程使用cpu的时间
- -u uid or username 选择有效的用户id或者是用户名
- -g gid or groupname 显示组的所有进程。
- U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
- -f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
- -l 长格式(有F,wchan,C 等字段)
- -j 作业格式
- -o 用户自定义格式。
- v 以虚拟存储器格式显示
- s 以信号格式显示
- -m 显示所有的线程
- -H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
- e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
- h 不显示第一行
pstree 可以很直接的看到相同的进程数量,最主要的还是我们可以看到所有进程的之间的相关性。
pstree -up
参数选择:
- -A :各程序树之间以 ASCII 字元来连接;
- -p :同时列出每个 process 的 PID;
- -u :同时列出每个 process 的所属账户名称。
日志系统
日志是系统管理、运维时不可或缺的东西,日志可以用来做问题定位,也可以通过它知道我们是否被不明用户登陆过等。Linux中大部分发行版都内置使用syslog系统日志,常见的日志一般存放在/var/log
中。
日志根据服务对象可分为存放系统内置程序或系统内核之类日志的系统日志和第三方应用产生的应用日志。
日志名称 | 记录信息 |
---|---|
alternatives.log | 系统的一些更新替代信息记录 |
apport.log | 应用程序崩溃信息记录 |
apt/history.log | 使用apt-get安装卸载软件的信息记录 |
apt/term.log | 使用apt-get时的具体操作,如 package 的下载打开等 |
auth.log | 登录认证的信息记录 |
boot.log | 系统启动时的程序服务的日志信息 |
btmp | 错误登陆的信息记录 |
Consolekit/history | 控制台的信息记录 |
dist-upgrade | dist-upgrade这种更新方式的信息记录 |
dmesg | 启动时,显示屏幕上内核缓冲信息,与硬件有关的信息 |
dpkg.log | dpkg命令管理包的日志 |
faillog | 用户登录失败详细信息记录 |
fontconfig.log | 与字体配置有关的信息记录 |
kern.log | 内核产生的信息记录,在自己修改内核时有很大帮助 |
lastlog | 用户的最近信息记录 |
wtmp | 登录信息的记录。wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等 |
syslog | 系统信息记录 |
可以通过命令less
来查看log文件中的信息。有两个特殊的日志文件wtmp
、lastlog
不是ASCII文件,是二进制文件,不能直接使用less、cat、more工具查看,可以通过last和lastlog工具提取其中信息。
现在大部分Linux默认使用rsyslog作为系统的日志收集工具,它提供了高性能、高安全功能和模块化设计。能实时收集日志信息的程序都会有其守护进程,rsyslog的守护进程是rsyslogd,可以通过ps aux
命令查看。
rsyslog是一个服务,也就可以通过配置提供一些我们自定义的服务,rsyslog配置文件有两个:一个是/etc/rsyslog.conf
,主要配置环境,即rsyslog加载什么模块、文件的所属者等;另一个是/etc/rsyslog.d/50-default.conf
,主要是配置的Filter Conditions 。
通过vim
查看和修改其中内容:
接下来是rsyslog的结构框架和数据流走向:
rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。
图片来源于http://www.rsyslog.com/doc/queues_analogy.html
Rsyslog 架构如图中所示,从图中我们可以很清楚的看见,rsyslog 还有一个核心的功能模块便是 Queue,也正是因为它才能做到如此高的并发。
Input模块的主要功能就是从各种各样的来源出收集 messages,Output 中也有许多可用的接口,可以通过man
或者官方的文档查看。这两个模块中的接口使用要通过$ModLoad
指令来加载。