学习资源
了解 Linux
Linux Kernel
指系统内核,负责完成操作系统最基本功能的程序
Kernel 的主要作用
- 统一管理计算机中的硬件资源
- 提供用户操作界面
- 提供应用程序的执行环境
Linux 发行版本
在 Linux 内核的基础之上,添加各种管理工具和应用软件,而构成的完整的操作系统
| RedHat | Fedora | 面向个人,定位于桌面用户,追求绚丽的桌面效果 |
|---|---|---|
| RedHat Enterpise Linux | 面向企业,功能强大,性能优越,需要付费 | |
| CentOS | 在 RHEL 基础上去掉了很多收费服务的二次编译,相当于免费版的 RHEL | |
| Debian | Ubuntu | 以桌面应用为主的 Linux 操作系统 |
| Kali | 设计用于数字取证操作系统 | |
| SUSE | openSUSE | 对个人来说是完全免费的,包括使用和在线更新 |
| SUSE Enterpise Linux | 主要是面向企业 |
Linux 哲学思想
- 一切皆文件
- 整个系统由众多的小程序组成
- 尽量避免与用户交互
- 使用纯文本文件保存配置信息
VMware 网络模式
| 网络设置模式 | 能否与物理主机通信 | 能否与外部计算机通信 | 与物理主机 IP 关系 |
|---|---|---|---|
| 桥接(bridged) | 能 | 能(但可能会造成 IP 冲突) | 需设置在同一网段 |
| 网络地址转换(NAT) | 能 | 能(单向访问,不会造成 IP 冲突) | 与 VMnet8 相同 |
| 仅主机(host-only) | 能 | 不能 | 与 VMnet1 相同 |
如果虚拟机要上网,建议设为 NAT 模式
Linux 常用命令
文件内容查看命令
| 命令 | 作用 | 选项与参数 | 作用 |
|---|---|---|---|
| cat | 由第一行开始显示文件内容 | -b | 列出行号,不包括空白行 |
| -n | 列出行号,包括空白行 | ||
| tac | 从最后一行开始显示 | ||
| nl | 显示时输出行号 | -b a | 不论是否为空行,也同样列出行号(类似 cat -n) |
| -b t | 如果有空行,空的那一行不要列出行号(默认值) | ||
| -n ln | 行号在荧幕的最左方显示 | ||
| -n rn | 行号在自己栏位的最右方显示,且不加 0 | ||
| -n rz | 行号在自己栏位的最右方显示,且加 0 | ||
| more | 一页一页的显示文件内容 | 空格键 | 向下翻一页 |
| Enter | 代表向下翻一行 | ||
| /字串 | 在显示的内容中,向下搜寻『字串』这个关键字 | ||
| :f | 立刻显示出档名以及目前显示的行数 | ||
| q | 立刻离开 more ,不再显示该文件内容 | ||
| b | 往回翻页 | ||
| less | 与 more 类似,但可往前翻页 | 空格键 | 向下翻一页 |
| /字串 | 向下搜寻『字串』 | ||
| q | 退出查看 | ||
| head | 只看头几行 | -n | 显示 n 行 |
| tail | 只看尾巴几行 | -n | 显示 n 行 |
| -f | 持续侦测后面所接的档名 | ||
| grep | 在某文件中查找指定字符串的行 (不支持通配符,但可用正则) |
“^字串” | 查找以『字串』开头的行 |
| “字串$” | 查找以『字串』结尾的行 | ||
| “^$” | 找出所有空白行 | ||
| -n | 输出符合查找条件的行以及行号 | ||
| -v | 反转查找,输出与查找条件不相符的行 | ||
| -i | 忽略关键字的大小写 | ||
| -w | 精确匹配单词,而不是字符串 | ||
| -r | 在某个目录下递归查找指定字符串 | ||
| diff | 文件内容对比 | a | 增加 |
| d | 减少 | ||
| c | 修改 | ||
| wc | 查看文件的信息 | -l | 查看文件有多少行 |
| -c | 查看文件有多少字节 | ||
| -L | 显示最长行的长度 | ||
| -w | 显示文件有多少个单词 |
文件查找命令
locate - 简单快速的文件查找命令
- locate 命令的优缺点
| 优点 | 缺点 |
| :—-: | :—-: |
|
1. 查找速度快
1. 无需指定查找起始路径
|
1. 只能模糊查找
1. 查找结果依赖于事先构建好的索引数据库
|
使用 locate 找出文件 “sshd_config” 的所在路径
[root@localhost ~]# locate sshd_config/etc/ssh/sshd_config
新建一个文件,使用 locate 命令无法找到
[root@localhost ~]# touch /tmp/hello.txt[root@localhost ~]# locate hello.txt[root@localhost ~]#
find - 强大的文件查找命令
find 命令的基本使用格式
find [查找起始路径] [选项] [查找条件] [处理动作]
- 查找起始路径:可以根据需要指定,默认为当前路径,如果指定为“/”,就表示在整个硬盘中进行查找
- 查找条件:指定的查找标准,可以根据文件名、文件大小、文件类型、从属关系、权限等进行设置,默认为找出指定路径下的所有文件
- 处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出
在使用find命令时,最重要的是如何设置查找条件,下面是一些常用的查找条件设置选项: | 选项 | 作用 | | 示例 | | :—-: | :—-: | :—-: | —- | | -name | 按名称查找,允许使用通配符 | | 在 /etc 目录中查找所有名称以 net 开头、以 .conf 结尾的文件:
find /etc -name "net*.conf"| | -iname | 按名称查找,不区分大小写 | | 在 /etc 目录中查找所有名称中包含字符串 “net” 的文件或目录,不区分大小写:find /etc -iname "*net*"| | -empty | 查找空文件或目录 | | 查找计算机中所有的空文档或目录:find / -empty| | -type | 按文件类型查找
- 普通文件:f
- 目录:d
- 符号链接文件:l
- 块设备文件:b
- 字符设备文件:c
| | 在 /boot 目录中查找所有的子目录:find /boot -type d
在 /etc 目录中查找所有的符号链接文件:find /etc -type l| | -size | 按文件大小查找(k,M,G) | | 在 /etc 目录中查找大小在 1MB 以上的文件:find /etc -size +1M
在 /boot 目录中查找大小在 10KB 以下的文件,并列出详细信息:find /boot -size -10k -ls| | -not | 取反 | | 在 /boot 目录中查找所有文件类型不是普通文件的文件,并显示其详细信息:find /boot -not -type f -ls| | -atime |
单位:天 | 按时间戳查找 | 在 /tmp 目录中查找7天内没有被访问过(最后一次访问是在7天之前)的文件:find /tmp -atime +7| | -mtime | | | 在计算机中查找2天前的当天被修改过的文件:find / -mtime 2| | -ctime | | | 在 /etc 目录中查找最近1天之内属性被改动过的文件:find /etc -ctime -1| | -amin | 单位:分钟 | | 在 /tmp 目录中查找2小时内没有被访问过(最后一次访问是在2小时之前)的文件:find /tmp -amin +120| | -mmin | | | 在 /etc 目录中查找最近1小时内容被改动过的文件:find /etc -mmin -60| | -cmin | | | 在 /etc 目录中查找最近1小时属性被改动过的文件:find /etc -cmin -60 -type f| | -exec | 对查找结果进一步处理
使用 {} 表示 find 查找的结果
在最后添加\;表示命令结束 | | 查找 /boot 目录下的以“init”开头的文件,并将其复制到 /tmp 目录下:find /boot -name "init*" -exec cp {} /tmp \;| | 同时指定多个查找条件 | | | 在 /boot 目录中查找大小超过 1024KB 而且文件名以 “init” 开头的文件:find /boot -size +1204k -name "init*"|
目录处理命令
| 命令 | 作用 | 选项与参数 | 作用 |
|---|---|---|---|
| ls | 列出目录及文件名 | -a | 列出全部文件,包含以 . 开头的隐藏文件 |
| -d | 仅列出目录本身,而不是列出目录内的文件数据 | ||
| -l | 长数据串列出,包含文件的属性与权限等 | ||
| cd | 切换目录 | cd/cd ~ | 回到用户家目录 |
| cd - | 回到之前的目录 | ||
| pwd | 显示目前的目录 | -p | 显示出确实的路径,而非使用连结 (link) 路径 |
| mkdir | 创建一个新的目录 | -m | 配置文件的权限 |
| -p | 将所需要的目录(包含上一级目录)递归创建 | ||
| rmdir | 删除一个空的目录 | -p | 连同上一级(空的)目录也一起删除 |
| cp | 复制文件或目录 | -f | 为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次 |
| -i | 若目标已存在,在覆盖时会先询问动作的进行 | ||
| -p | 连同文件的属性一起复制过去 | ||
| -r | 递归持续复制 | ||
| rm | 移除文件或目录 | -f | 忽略不存在的文件,不会出现警告信息 |
| -i | 互动模式,在删除前会询问使用者是否动作 | ||
| -r | 递归删除 | ||
| rm-rf /* | 强制递归删除根目录下所有文件和文件夹(自杀) | ||
| mv | 移动文件与目录, 或修改名称 |
-f | 如果目标文件已经存在,不会询问而直接覆盖 |
| -i | 若目标文件已经存在,会询问是否覆盖 | ||
| -u | 若目标文件已经存在,且 source 比较新,才会升级 |
可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp
日期与时间命令
date - 系统时钟
| 命令 | 作用 | 显示结果 |
|---|---|---|
| date | 显示当前详细时间 | 2020年 08月 02日 星期日 13:35:48 CST |
| date +%F | 只显示日期,使用格式符 %F |
2020-08-02 |
| date +%T | 只显示时间,使用格式符 %T |
13:39:40 |
| date +”%F %T” | 日期和时间一起显示,并在中间用空格分隔 | 2020-08-02 13:42:09 |
| date +”%Y-%m-%d %H:%M:%S” | 以“年-月-日 时:分:秒”的格式显示日期和时间 | 2020-08-02 13:43:54 |
注意:使用 date --help 可以查看所有时间格式
- 备份文件时,给文件后缀加上时间
[root@localhost ~]# cp /etc/passwd /tmp/passwd.bak.$(date +%F)passwd.bak.2020-08-02
hwclock - 硬件时钟
| 命令 | 作用 |
|---|---|
| hwclock | 显示硬件时钟 |
| hwclock -w | 将系统时钟写入硬件时钟 |
| hwclock -s | 将硬件时钟写入系统时钟 |
cal - 显示日历
显示当前月份的日历
[root@localhost ~]# cal八月 2020日 一 二 三 四 五 六12 3 4 5 6 7 89 10 11 12 13 14 1516 17 18 19 20 21 2223 24 25 26 27 28 2930 31
显示指定月份的日历
[root@localhost ~]# cal 9 2020九月 2020日 一 二 三 四 五 六1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30
显示指定年的日历
[root@localhost ~]# cal 20202020一月 二月 三月日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六1 2 3 4 1 1 2 3 4 5 6 75 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 1412 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 2119 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 2826 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31四月 五月 六月日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六1 2 3 4 1 2 1 2 3 4 5 65 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 1312 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 2019 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 2726 27 28 29 30 24 25 26 27 28 29 30 28 29 3031七月 八月 九月日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六1 2 3 4 1 1 2 3 4 55 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 1212 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 1919 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 2626 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 3030 31十月 十一月 十二月日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六1 2 3 1 2 3 4 5 6 7 1 2 3 4 54 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 1211 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 1918 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 2625 26 27 28 29 30 31 29 30 27 28 29 30 31
stat - 查看时间戳
stat 命令用于查看文件的元数据
元数据用于描述文件的属性,主要包括文件大小、存储位置、访问权限以及时间戳等信息
stat命令所查看结果的最后三行称为文件的时间戳,时间戳包括三种:
| 时间戳类型 | 英文 | 作用 |
|---|---|---|
| 最近访问时间 | access time | 查看、读取文件内容的时间 |
| 最近更改时间 | modify time | 文件内容改变的时间 |
| 最近改动时间 | change time | 文件元数据(属性)改变的时间 |
注意:文件更改时间改变,改动时间也会变化,反之则未必
查看 test1.txt 的时间戳:
[root@localhost ~]# stat test1.txt文件:"test1.txt"大小:22 块:8 IO 块:4096 普通文件设备:fd00h/64768d Inode:33575011 硬链接:1权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)环境:unconfined_u:object_r:admin_home_t:s0最近访问:2020-08-01 20:14:54.344679080 +0800最近更改:2020-08-01 20:14:52.700679189 +0800最近改动:2020-08-01 20:14:52.700679189 +0800创建时间:-
Shell 脚本编程基础
shell 脚本编程属于面向过程编程
**
面向过程编程:以指令为中心,数据服务于指令,一般根据业务逻辑从上到下编写代码
了解Shell 脚本
Shell 脚本语法
一个简单的 Shell 脚本 = 解释器路径 + 可执行命令 + 注释
#!/bin/bashcat /etc/centos-releaseecho 'hello world!' #输出 “hello world!”
注意:在脚本文件的第一行要求顶格写出解释器的路径,用于指明解释执行当前脚本的解释器程序文件
解释器:指系统中的 Shell,CentOS 默认使用的 Shell 是 bash,解释器可以将脚本中的代码转换为二进制,从而方便系统执行
执行 Shell 脚本
首先创建一个 Shell 脚本
[root@localhost ~]# vim hello.sh#!/bin/bashcat /etc/centos-releaseecho 'hello world!'
通常有两种方式来执行 Shell 脚本:
使用
bash命令执行 Shell 脚本[root@localhost ~]# bash hello.shCentOS Linux release 7.8.2003 (Core)hello world!
通过
./执行 Shell 脚本[root@localhost ~]# chmod a+x hello.sh[root@localhost ~]# ./hello.shCentOS Linux release 7.8.2003 (Core)hello world!
注意:默认创建的文件权限为 644 ,没有执行权限,所以要先为所有用户添加执行权限
调试 Shell 脚本
检查是否有语法错误
[root@localhost ~]# bash -n hello.sh
将执行的命令一起输出,方便检查错误 ```bash [root@localhost ~]# bash -x hello.sh
- cat /etc/centos-release CentOS Linux release 7.8.2003 (Core)
- echo ‘hello world!’ hello world! ```
Shell 变量
Shell 脚本中常见的变量类型
| 变量类型 | 作用 |
|---|---|
| 用户自定义变量 | 由用户自己定义、修改和使用,作用域仅为当前Shell进程 |
| 环境变量 | 由系统定义,主要用于设置用户工作环境 |
| 位置变量 | 通过命令行给脚本程序传递参数 |
| 预定义变量 | Bash 中内置的有特殊功用的变量,不能直接修改,如变量$?可以返回命令执行后的状态 |
