学习资源

了解 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” 的所在路径

    1. [root@localhost ~]# locate sshd_config
    2. /etc/ssh/sshd_config
  • 新建一个文件,使用 locate 命令无法找到

    1. [root@localhost ~]# touch /tmp/hello.txt
    2. [root@localhost ~]# locate hello.txt
    3. [root@localhost ~]#

find - 强大的文件查找命令

  • find 命令的基本使用格式

    1. 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 可以查看所有时间格式

  • 备份文件时,给文件后缀加上时间
    1. [root@localhost ~]# cp /etc/passwd /tmp/passwd.bak.$(date +%F)
    2. passwd.bak.2020-08-02

hwclock - 硬件时钟

命令 作用
hwclock 显示硬件时钟
hwclock -w 将系统时钟写入硬件时钟
hwclock -s 将硬件时钟写入系统时钟

cal - 显示日历

  • 显示当前月份的日历

    1. [root@localhost ~]# cal
    2. 八月 2020
    3. 1
    4. 2 3 4 5 6 7 8
    5. 9 10 11 12 13 14 15
    6. 16 17 18 19 20 21 22
    7. 23 24 25 26 27 28 29
    8. 30 31
  • 显示指定月份的日历

    1. [root@localhost ~]# cal 9 2020
    2. 九月 2020
    3. 1 2 3 4 5
    4. 6 7 8 9 10 11 12
    5. 13 14 15 16 17 18 19
    6. 20 21 22 23 24 25 26
    7. 27 28 29 30
  • 显示指定年的日历

    1. [root@localhost ~]# cal 2020
    2. 2020
    3. 一月 二月 三月
    4. 1 2 3 4 1 1 2 3 4 5 6 7
    5. 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
    6. 12 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
    7. 19 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
    8. 26 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
    9. 四月 五月 六月
    10. 1 2 3 4 1 2 1 2 3 4 5 6
    11. 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
    12. 12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
    13. 19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
    14. 26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
    15. 31
    16. 七月 八月 九月
    17. 1 2 3 4 1 1 2 3 4 5
    18. 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
    19. 12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
    20. 19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
    21. 26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
    22. 30 31
    23. 十月 十一月 十二月
    24. 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
    25. 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
    26. 11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
    27. 18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
    28. 25 26 27 28 29 30 31 29 30 27 28 29 30 31

stat - 查看时间戳

stat 命令用于查看文件的元数据
元数据用于描述文件的属性,主要包括文件大小、存储位置、访问权限以及时间戳等信息

stat命令所查看结果的最后三行称为文件的时间戳,时间戳包括三种:

时间戳类型 英文 作用
最近访问时间 access time 查看、读取文件内容的时间
最近更改时间 modify time 文件内容改变的时间
最近改动时间 change time 文件元数据(属性)改变的时间

注意:文件更改时间改变,改动时间也会变化,反之则未必

查看 test1.txt 的时间戳:

  1. [root@localhost ~]# stat test1.txt
  2. 文件:"test1.txt"
  3. 大小:22 块:8 IO 块:4096 普通文件
  4. 设备:fd00h/64768d Inode33575011 硬链接:1
  5. 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
  6. 环境:unconfined_u:object_r:admin_home_t:s0
  7. 最近访问:2020-08-01 20:14:54.344679080 +0800
  8. 最近更改:2020-08-01 20:14:52.700679189 +0800
  9. 最近改动:2020-08-01 20:14:52.700679189 +0800
  10. 创建时间:-

Shell 脚本编程基础

shell 脚本编程属于面向过程编程
**

面向过程编程:以指令为中心,数据服务于指令,一般根据业务逻辑从上到下编写代码

了解Shell 脚本

Shell 脚本语法

一个简单的 Shell 脚本 = 解释器路径 + 可执行命令 + 注释

  1. #!/bin/bash
  2. cat /etc/centos-release
  3. echo 'hello world!' #输出 “hello world!”

注意:在脚本文件的第一行要求顶格写出解释器的路径,用于指明解释执行当前脚本的解释器程序文件

解释器:指系统中的 Shell,CentOS 默认使用的 Shell 是 bash,解释器可以将脚本中的代码转换为二进制,从而方便系统执行

执行 Shell 脚本

首先创建一个 Shell 脚本

  1. [root@localhost ~]# vim hello.sh
  2. #!/bin/bash
  3. cat /etc/centos-release
  4. echo 'hello world!'

通常有两种方式来执行 Shell 脚本:

  1. 使用 bash 命令执行 Shell 脚本

    1. [root@localhost ~]# bash hello.sh
    2. CentOS Linux release 7.8.2003 (Core)
    3. hello world!
  2. 通过 ./ 执行 Shell 脚本

    1. [root@localhost ~]# chmod a+x hello.sh
    2. [root@localhost ~]# ./hello.sh
    3. CentOS Linux release 7.8.2003 (Core)
    4. hello world!

    注意:默认创建的文件权限为 644 ,没有执行权限,所以要先为所有用户添加执行权限

调试 Shell 脚本

  • 检查是否有语法错误

    1. [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 中内置的有特殊功用的变量,不能直接修改,如变量$?可以返回命令执行后的状态