Linux 完整学习笔记

一、Linux 概述与环境搭建

1.1 Linux 内核与系统组成

Linux 系统由两部分组成:

  • Linux 系统内核:提供系统最核心的功能,如调度 CPU、调度内存、调度文件系统、调度网络通讯、调度 IO 等。
  • 系统级应用程序:出厂自带程序,可供用户快速上手操作系统,如文件管理器、任务管理器、图片查看、音乐播放等。

Linux 内核是免费开源的,任何人都可以下载内核源码并查看且修改。

可以通载 Linux 内核。

Linux 系统架构图(示意):

复制代码
应用程序
   ↓
Shell(命令解释器)
   ↓
操作系统内核
   ↓
硬件

用户 → 使用 → 第三方程序 → 调用 → 内核 → 调度 → 硬件

用户 → 使用 → 系统程序 → 调用 → 内核 → 调度 → 硬件

1.2 Linux 发行版

任何人都可以封装 Linux,目前市面上有非常多的 Linux 发行版,常用的如下:

发行版 说明
Linux Mint 基于 Ubuntu,界面友好
Ubuntu 最流行的桌面 Linux
Arch Linux 滚动更新,高度可定制
CentOS 企业级,RedHat 免费版
RedHat 商业企业级
Debian 稳定,Ubuntu 的上游
Fedora RedHat 的社区版
openSUSE 德国出品
deepin 国产,界面美观
中标麒麟 / 红旗 Linux 国产政府用

1.3 VMware 虚拟机与快照

VMware 虚拟机(Workstation 和 Fusion)支持为虚拟机制作快照

通过快照将当前虚拟机的状态保存下来 ,在以后可以通过快照恢复虚拟机到保存的状态

类似于游戏存档,死亡后回档即可,故在进行任何测试之前拍摄快照很有必要,平时在系统稳定运行时拍摄快照也是很重要的。

快照时间线示意图:

复制代码
快照1          快照3
  ↑              ↑
──●──●──●──●──●──→ 时间线
              ↓
            当前状态
  ↓
快照2

Windows 快速查看 VMware 网络连接: 使用 ncpa.cpl 指令快速查看 VMware 网络连接情况。


二、Linux 目录结构

Linux 的文件系统是一个独立且唯一的树形结构,以根目录 / 为起点。

2.1 常用目录说明

目录 重要性 说明
/bin 常用 Binary 的缩写,存放最经常使用的命令(也在 /usr/bin/usr/local/bin
/sbin Super User 的意思,存放系统管理员使用的系统管理程序(也在 /usr/sbin/usr/local/sbin
/home 常用 存放普通用户的主目录,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名
/root 常用 该目录为系统管理员(超级权限者)的用户主目录
/lib 系统开机所需要最基本的动态连接共享库,作用类似于 Windows 里的 DLL 文件
/lost+found 一般情况下是空的,当系统非法关机后,就存放了一些文件
/etc 常用 所有的系统管理所需要的配置文件和子目录,比如安装 mysql 数据库的 my.conf
/usr 常用 用户的很多应用程序和文件都放在这个目录下,类似于 Windows 下的 program files
/boot 常用 存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件
/proc 不能动 虚拟目录,是系统内存的映射,访问这个目录来获取系统信息
/srv 不能动 service 缩写,该目录存放一些服务启动之后需要提取的数据
/sys 不能动 Linux 2.6 内核的一个很大的变化,该目录下安装了 2.6 内核中新出现的文件系统 sysfs
/tmp 存放一些临时文件的目录
/dev 类似于 Windows 的设备管理器,把所有的硬件用文件的形式存储
/media 常用 Linux 系统会自动识别一些设备,如 U 盘、光驱等,识别后 Linux 会把识别的设备挂载到这个目录下
/mnt 常用 系统提供该目录是为了让用户临时挂载别的文件系统的,可以将外部的存储挂载在 /mnt/
/opt 给主机额外安装软件所存放的目录,如安装 ORACLE 数据库就可放到该目录下,默认为空
/usr/local 常用 给主机额外安装软件所安装的目录,一般是通过编译源码方式安装的程序
/var 常用 存放着不断扩充的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件
/selinux SELinux 是一种安全子系统,能控制程序只能访问特定文件,有三种工作模式,可以自行设置

三、基础命令

3.1 命令通用格式

无论是什么命令,在 Linux 中,命令有其通用的格式:

复制代码
command [-options] [parameter]
  • command:命令本身
  • -options可选,非必填 命令的一些选项,可以通过选项控制命令的行为细节
  • parameter可选,非必填 命令的参数,多数用于命令的指向目标等

3.2 帮助命令

man 命令

获取帮助信息。

复制代码
man [命令或配置文件]   # 功能:获得帮助信息
# 案例:查看 ls 命令的帮助信息
man ls
help 命令
复制代码
help 命令   # 功能:获得 shell 内置命令的帮助信息

3.3 ls 命令

ls 命令格式:ls [-a -l -h] [Linux路径](选项加 R 代表递归,将子目录中的文件都罗列出来)

示例说明:

  • ls -l /home/itheima:以列表的形式,显示 /home/itheima 目录内的内容
  • cp -r test1 test2:cp 是命令本身,-r 是选项,test1 和 test2 是参数,意思是复制文件夹 test1 成为 test2

ls 选项说明:

选项 说明
无选项 以平铺形式,列出当前工作目录下的内容
-a all 的意思,即列出全部文件(包含隐藏的文件/文件夹)。以 . 开头的,表示是 Linux 系统的隐藏文件/文件夹(只要以 . 开头,就能自动隐藏),只有通过 -a 选项,才能看到这些隐藏的文件/文件夹
-l 以列表(竖向排列)的形式展示内容,并展示更多细节
-h 以易于阅读的形式,列出文件大小,如 K、M、G。-h 选项必须要搭配 -l 一起使用

参数作用: 可以指定要查看的文件夹(目录)的内容,如果不给定参数,就查看当前工作目录的内容。

命令选项组合使用: 命令的选项是可以组合使用的,比如 ls -lah,等同于 ls -a -l -h

3.4 cd 命令 / pwd 命令

cd 命令

cd 来自英文:C hange Directory

复制代码
cd [Linux路径]
  • 没有选项,只有参数,表示目标路径
  • 使用参数,切换到指定路径
  • 不使用参数,切换工作目录到当前用户的 HOME

特殊路径符:

符号 含义
. 表示当前目录,如 cd ./Desktop 表示切换到当前目录下的 Desktop 目录内,和 cd Desktop 效果一致
.. 表示上一级目录,如 cd .. 即可切换到上一级目录,cd ../.. 切换到上二级的目录
~ 表示 HOME 目录,如 cd ~ 即可切换到 HOME 目录或 cd ~/Desktop,切换到 HOME 内的 Desktop 目录
pwd 命令

pwd 来自英文:P rint W ork Directory

复制代码
pwd
  • 无选项,无参数,直接输入 pwd 即可
  • 作用是:输出当前所在的工作目录

3.5 绝对路径和相对路径

  • 绝对路径 :以根目录为起点,描述路径的一种写法,路径描述以 / 开头
  • 相对路径 :以当前目录为起点,描述路径的一种写法,路径描述无需以 / 开头

3.6 HOME 目录

Linux 系统的命令行终端,在启动的时候,默认会加载:

  • 当前登录用户的 HOME 目录作为当前工作目录,所以 ls 命令列出的是 HOME 目录的内容
  • HOME 目录:每个 Linux 操作用户在 Linux 系统的个人账户目录,路径在:/home/用户名

3.7 less 命令

less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

less 操作键:

操作 功能说明
空白键 向下翻动一页
pagedown 向下翻动一页
pageup 向上翻动一页
/字串 向下搜寻「字串」的功能;n:向下查找;N:向上查找
?字串 向上搜寻「字串」的功能;n:向下查找;N:向上查找
q 离开 less 这个程序

3.8 mkdir 命令

通过 mkdir 命令可以创建新的目录(文件夹)。mkdir 来自英文:M ake Directory

复制代码
mkdir [-p] Linux路径
  • 参数必填,表示 Linux 路径,即要创建的文件夹的路径,相对路径或绝对路径均可
  • -p 选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录

示例:

复制代码
# 错误示例:会报错,因为上级目录 itcast 和 good 并不存在
mkdir itcast/good/666

# 正确示例:使用 -p 选项,将一整个链条都创建完成
mkdir -p itcast/good/666
cd itcast/good/666
pwd
# 输出:/home/itheima/itcast/good/666

3.9 rmdir 命令

5. rmdir:删除空目录

复制代码
rmdir [OPTION]... DIRECTORY...

rmdir 只能用于删除空目录。如果目录非空,使用该命令会提示错误。

3.10 touch 命令

6. touch:创建空文件

复制代码
touch [OPTION]... FILE...

touch 命令用于创建一个或多个空文件。touch test.txt 会在当前目录下创建一个名为 test.txt 的空文件。

3.11 cat 命令

复制代码
cat Linux路径
  • cat 同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用

示例:

复制代码
[itheima@bogon ~]$ cat test.txt
itheima is a brand of itcast.

3.12 more 命令

more 命令同样可以查看文件内容,同 cat 不同的是:

  • cat 是直接将内容全部显示出来

  • more 支持翻页,如果文件内容过多,可以一页一页的展示

    more Linux路径

  • 同样没有选项,只有必填参数,参数表示:被查看的文件路径

  • q 退出

3.13 cp 命令

cp 命令可以用于复制文件\文件夹,cp 命令来自英文单词:copy

复制代码
cp [-r] 参数1 参数2
  • -r 选项,可选,用于复制文件夹使用,表示递归
  • 参数1,Linux 路径,表示被复制的文件或文件夹
  • 参数2,Linux 路径,表示要复制去的地方

3.14 mv 命令

mv 命令可以用于移动文件\文件夹,mv 命令来自英文单词:move

复制代码
mv 参数1 参数2
  • 参数1,Linux 路径,表示被移动的文件或文件夹
  • 参数2,Linux 路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在

3.15 rm 命令

rm 命令可用于删除文件、文件夹,rm 命令来自英文单词:remove

复制代码
rm [-r -f] 参数1 参数2 ...... 参数N
  • 同 cp 命令一样,-r 选项用于删除文件夹
  • -f 表示 force,强制删除(不会弹出提示确认信息)
    • 普通用户删除内容不会弹出提示,只有 root 管理员用户删除内容会有提示
    • 所以一般普通用户用不到 -f 选项
  • 参数1、参数2、......、参数N 表示要删除的文件或文件夹路径,按照空格隔开

rm 通配符: rm 命令支持通配符 *,用来做模糊匹配:

  • test*,表示匹配任何以 test 开头的内容
  • *test,表示匹配任何以 test 结尾的内容
  • *test*,表示匹配任何包含 test 的内容

注意: su root 命令进入管理员模式,exit 命令退回普通用户模式。

3.16 which 命令 / find 命令 / locate 命令

which 命令

通过 which 命令,查看所使用的一系列命令的程序文件存放在哪里。

复制代码
which 要查找的命令
find 命令

在 Linux 系统中,可以通过 find 命令去搜索指定的文件。

按文件名查找:

复制代码
find 起始路径 -name "被查找文件名"
# 被查找文件名,支持使用通配符 * 来做模糊查询

按文件大小查找:

复制代码
find 起始路径 -size +|-n[kMG]
# +、- 表示大于和小于
# n 表示大小数字
# kMG 表示大小单位,k(小写字母)表示 kb,M 表示 MB,G 表示 GB

示例:

复制代码
find / -size -10k    # 查找小于 10KB 的文件
find / -size +100M   # 查找大于 100MB 的文件
find / -size +1G     # 查找大于 1GB 的文件

find 常用参数说明:

参数 说明
-name pattern 按文件名查找,支持通配符 * 和 ?
-type type 按文件类型查找,f(普通文件)、d(目录)、l(符号链接)等
-size [+-]size[cwbkMG] 按文件大小查找
-mtime days 按修改时间查找,支持 + 或 -
-user username 按文件所有者查找
-group groupname 按文件所属组查找
-amin n 查找在 n 分钟内被访问过的文件
-atime n 查找在 n×24 小时内被访问过的文件
-mmin n 查找在 n 分钟内被修改过的文件
-mtime n 查找在 n×24 小时内被修改过的文件
locate 命令

locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。locate 指令无需遍历整个文件系统,查询速度较快。

复制代码
locate 搜索文件

特别说明: 由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。

3.17 grep 命令

可以通过 grep 命令,从文件中通过关键字过滤文件行。

复制代码
grep [-n] 关键字 文件路径
  • 选项 -n,可选,表示在结果中显示匹配的行的行号
  • 参数,关键字,必填,表示过滤的关键字,带有空格或其它特殊符号,建议使用 " " 将关键字包围起来
  • 参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口

3.18 wc 命令

可以通过 wc 命令统计文件的行数、单词数量等。

复制代码
wc [-c -m -l -w] 文件路径
选项 说明
-c 统计 bytes 数量
-m 统计字符数量
-l 统计行数
-w 统计单词数量
  • 参数,文件路径,被统计的文件,可作为内容输入端口

3.19 管道符 |

管道符的含义是:将管道符左边命令的结果,作为右边命令的输入。

复制代码
cat test.txt | grep "关键字"
ps -ef | grep tail

3.20 echo 命令

可以使用 echo 命令在命令行内输出指定内容。

复制代码
echo 输出的内容
  • 无需选项,只有一个参数,表示要输出的内容,复杂内容可以用 " " 包围

3.21 head 命令

(4) head:从文件头开始查看内容

复制代码
head [OPTION]... [FILE]...

head 命令从文件头开始查看内容,使用 -n 行数 可以指定查看的行数。

3.22 tail 命令

使用 tail 命令,可以查看文件尾部内容,跟踪文件的最新更改:

复制代码
tail [-f -num] Linux路径
  • 参数,Linux 路径,表示被跟踪的文件路径
  • 选项,-f,表示持续跟踪
  • 选项,-num,表示,查看尾部多少行,不填默认 10 行

3.23 反引号与重定向符号

反引号 `````

通过将命令用反引号(通常也称之为飘号)包围,被包围的内容,会被作为命令执行,而非普通字符。

复制代码
[itheima@bogon ~]$ echo `pwd`
/home/itheima
重定向符号
  • >,将左侧命令的结果,覆盖写入到符号右侧指定的文件中

  • >>,将左侧命令的结果,追加写入到符号右侧指定的文件中

    echo "hello" > test.txt # 覆盖写入
    echo "world" >> test.txt # 追加写入

3.24 test 命令

复制代码
test EXPRESSION
# 或
[ EXPRESSION ]   # 注意方括号内必须有空格

文件测试操作:

操作符 描述 示例
-e 文件是否存在 [ -e file.txt ]
-f 是普通文件 [ -f /path/to/file ]
-d 是目录 [ -d /path/to/dir ]
-r 可读 [ -r file.txt ]
-w 可写 [ -w file.txt ]
-x 可执行 [ -x script.sh ]
-s 文件大小 > 0 [ -s logfile ]
-L 是符号链接 [ -L symlink ]

3.25 sed 命令

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

复制代码
sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

  • -e<script> 以选项中指定的 script 来处理输入的文本文件
  • -f<script文件> 以选项中指定的 script 文件来处理输入的文本文件
  • -h 显示帮助
  • -n 仅显示 script 处理后的结果
  • -V 显示版本信息

动作说明:

动作 说明
a 新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c 取代,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d 删除
i 插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p 打印,通常 p 会与参数 sed -n 一起运行
s 取代,可以直接进行取代工作,通常这个 s 的动作可以搭配正则表达式,如 1,20s/old/new/g

3.26 vim/vi 编辑器

vim/vi 是 Linux 中最常用的文本编辑器。

三种工作模式:

  • 命令模式(Command mode):命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。此模式下,不能自由进行文本编辑。
  • 输入模式(Insert mode):也就是所谓的编辑模式、插入模式。此模式下,可以对文件内容进行自由编辑。
  • 底线命令模式(Last line mode) :以 : 开始,通常用于文件的保存、退出。

Vim/Vi 工作模式切换图:

复制代码
进入          退出
vi filename   输入:wq
     ↓              ↑
  ┌──────────────────┐
  │     命令模式      │
  └──────────────────┘
    输入 i a o ↓   : ↓ 命令以回车结束运行
  ┌──────────┐  ┌──────────────┐
  │  输入模式  │  │  底线命令模式 │
  └──────────┘  └──────────────┘
      ESC键 ↑

Vim 键盘图(vi/vim 键盘图):

完整键盘功能图(部分常用):

命令 功能
i 插入模式(光标前插入)
a 在行尾附加
o 在下一行插入
ESC 退回命令模式
:w 保存
:q 退出
:wq 保存并退出
:q! 不保存强制退出
dd 删除当前行
yy 复制当前行
p 粘贴
u 撤销
gg 文首(vim only)
ZZ 保存退出,ZQ 不保存退出
:%s/x/y/g 全局替换 x 为 y
CTRL-R 重复(vim)
CTRL-F/B 上翻/下翻

3.27 关机与重启

复制代码
shutdown -h now    # 立该进行关机
shutdown -h 1      # "hello,1 分钟后会关机了"
shutdown -r now    # 现在重新启动计算机
halt               # 关机,作用和上面一样
reboot             # 现在重新启动计算机
sync               # 把内存的数据同步到磁盘

四、用户与权限管理

4.1 root 用户

无论是 Windows、MacOS、Linux 均采用多用户的管理模式进行权限管理。

  • 在 Linux 系统中,拥有最大权限的账户名为:root(超级管理员)
  • root 用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的

4.2 su 命令(Switch User)

su 命令就是用于账户切换的系统命令,其来源英文单词:Switch User

复制代码
su [-] [用户名]
  • - 符号是可选的,表示是否在切换用户后加载环境变量(建议带上)
  • 参数:用户名,表示要切换的用户,用户名也可以省略,省略表示切换到 root
  • 切换用户后,可以通过 exit 命令退回上一个用户,也可以使用快捷键:ctrl + d
  • 在提示符下输入 logout 即可注销用户

4.3 sudo 命令

复制代码
sudo 其它命令
  • 在其它命令之前,带上 sudo,即可为这一条命令临时赋予 root 授权
  • 但是并不是所有的用户,都有权利使用 sudo,需要为普通用户配置 sudo 认证

配置 sudo 认证步骤:

  1. 切换到 root 用户,执行 visudo 命令,会自动通过 vi 编辑器打开:/etc/sudoers

  2. 在文件的最后添加:

    复制代码
    itheima ALL=(ALL)     NOPASSWD: ALL
    • 其中最后的 NOPASSWD:ALL 表示使用 sudo 命令,无需输入密码
  3. 最后通过 wq 保存

4.4 用户与用户组管理

Linux 系统中可以:配置多个用户、配置多个用户组、用户可以加入多个用户组中。

Linux 中关于权限的管控级别有 2 个级别,分别是:

  • 针对用户的权限控制
  • 针对用户组的权限控制

以下命令需 root 用户执行:

复制代码
# 创建用户组
groupadd 用户组名

# 删除用户组
groupdel 用户组名

# 创建用户
useradd [-g -d] 用户名
# -g 指定用户的组,不指定 -g,会创建同名组并自动加入
# -d 指定用户 HOME 路径,不指定,HOME 目录默认在:/home/用户名

# 删除用户
userdel [-r] 用户名
# -r,删除用户的 HOME 目录,不使用 -r,删除用户时,HOME 目录保留

# 查看用户所属组
id [用户名]
# 参数:用户名,被查看的用户,如果不提供则查看自身

# 修改用户所属组
usermod -aG 用户组 用户名   # 将指定用户加入指定用户组

4.5 getent 命令

复制代码
# 查看系统中有哪些用户
getent passwd
# 格式:用户名:密码(x):用户ID:组ID:描述信息(无用):HOME目录:执行终端(默认bash)

# 查看系统中有哪些用户组
getent group
# 格式:组名称:组认证(显示为x):组ID

4.6 权限管控信息

权限细节总共分为 10 个槽位:

复制代码
-或d或l | r或- | w或- | x或- | r或- | w或- | x或- | r或- | w或- | x或-
  类型      所属用户权限         所属用户组权限          其它用户权限
  • - 表示文件
  • d 表示文件夹
  • l 表示软链接

rwx 权限说明:

权限 对文件的作用 对文件夹的作用
r 可以查看文件内容 可以查看文件夹内容,如 ls 命令
w 可以修改此文件 可以在文件夹内:创建、删除、改名等操作
x 可以将文件作为程序执行 表示可以更改工作目录到此文件夹,即 cd 进入

4.7 chmod 命令

可以使用 chmod 命令,修改文件、文件夹的权限信息。

注意:只有文件、文件夹的所属用户或 root 用户可以修改。

复制代码
chmod [-R] 权限 文件或文件夹
  • 选项:-R,对文件夹内的全部内容应用同样的操作

数字权限表示:

数字 权限
0 无任何权限,即 ---
1 仅有 x 权限,即 --x
2 仅有 w 权限,即 -w-
3 有 w 和 x 权限,即 -wx
4 仅有 r 权限,即 r--
5 有 r 和 x 权限,即 r-x
6 有 r 和 w 权限,即 rw-
7 有全部权限,即 rwx

r 记为 4,w 记为 2,x 记为 1

示例: chmod 751 hello.sh 表示:所属用户 rwx,所属组 r-x,其他 --x

4.8 chown 命令

使用 chown 命令,可以修改文件、文件夹的所属用户和用户组。

普通用户无法修改所属为其它用户或组,所以此命令只适用于 root 用户执行。

复制代码
chown [-R] [用户][:][用户组] 文件或文件夹
  • 选项,-R,同 chmod,对文件夹内全部内容应用相同规则
  • 选项,用户,修改所属用户
  • 选项,用户组,修改所属用户组
  • :,用于分隔用户和用户组

示例:

复制代码
chown root hello.txt           # 将 hello.txt 所属用户修改为 root
chown :root hello.txt          # 将 hello.txt 所属用户组修改为 root
chown root:itheima hello.txt   # 将 hello.txt 所属用户修改为 root,用户组修改为 itheima
chown -R root test             # 将文件夹 test 的所属用户修改为 root 并对文件夹内全部内容应用同样规则

4.9 init 运行级别

init 一共分为 7 个级别,这 7 个级别所代表的含义如下:

级别 说明
0 停机或者关机(千万不能将 initdefault 设置为 0)
1 单用户模式,只 root 用户进行维护
2 多用户模式,不能使用 NFS(Net File System)
3 完全多用户模式(标准的运行级别)
4 安全模式
5 图形化(即图形界面)
6 重启(千万不要把 initdefault 设置为 6)

命令: init [0123456] 应用案例:通过 init 来切换不同的运行级别,比如动 5-3,然后关机。

在 CentOS 7/etc/inittab 文件中进行了简化:

复制代码
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5

# 查看当前默认 target:
systemctl get-default

# 设置默认 target:
systemctl set-default TARGET.target

示例:

复制代码
[root@hspEdu01 ~]# systemctl get-default
graphical.target

[root@hspEdu01 ~]# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

五、实用操作与技巧

5.1 快捷键

快捷键 功能
ctrl + c 强制停止。Linux 某些程序的运行,如果想要强制停止它,可以使用快捷键 ctrl + c;命令输入错误,也可以通过快捷键 ctrl + c,退出当前输入,重新输入
ctrl + d 退出或登出。可以通过快捷键 ctrl + d,退出账户的登录;或者退出某些特定程序的专属页面(如 python 交互式界面)
ctrl + r 搜索历史命令。输入内容去匹配历史命令;如果搜索到的内容是需要的,回车键可以直接执行,键盘左右键,可以得到此命令(不执行)
ctrl + a 跳到命令开头
ctrl + e 跳到命令结尾
ctrl + 左键 向左跳一个单词
ctrl + 右键 向右跳一个单词
ctrl + l 清屏,或通过命令 clear 得到同样效果
history 查看历史输入过的命令
!命令前缀 自动执行上一次匹配前缀的命令

5.2 软链接(快捷方式)

在系统中创建软链接,可以将文件、文件夹链接到其它位置。类似 Windows 系统中的《快捷方式》。

复制代码
ln -s 参数1 参数2
  • -s 选项,创建软连接
  • 参数1:被链接的文件或文件夹
  • 参数2:要链接去的目的地

5.3 日期与时区

date 命令

通过 date 命令可以在命令行中查看系统的时间。

复制代码
date [-d] [+格式化字符串]
  • -d 按照给定的字符串显示日期,一般用于日期计算
  • 格式化字符串:通过特定的字符串标记,来控制显示的日期格式

格式化字符:

字符 说明
%Y
%y 年份后两位数字(00~99)
%M 月份(01~12)
%d 日(01~31)
%H 小时(00~23)
%M 分钟(00~59)
%S 秒(00~60)
%s 自 1970-01-01 00:00:00 UTC 到现在的秒数

-d 选项日期计算(支持的时间标记:year/month/day/hour/minute/second):

复制代码
date -d "+1 day" +%Y%m%d    # 显示后一天的日期
date -d "-1 day" +%Y%m%d    # 显示前一天的日期
date -d "-1 month" +%Y%m%d  # 显示上一月的日期
date -d "+1 month" +%Y%m%d  # 显示下一月的日期
date -d "-1 year" +%Y%m%d   # 显示前一年的日期
date -d "+1 year" +%Y%m%d   # 显示下一年的日期
cal 命令

2. cal:显示日历

复制代码
cal [options] [[[day] month] year]
  • cal:显示当前月的日历
  • cal 年份:显示某年份的日历
修改时区

使用 root 权限,执行如下命令,修改时区为东八区时区:

复制代码
rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 将系统自带的 localtime 文件删除,并将 /usr/share/zoneinfo/Asia/Shanghai 文件链接为 localtime 文件即可
ntp 时间同步

可以通过 ntp 程序自动校准系统时间:

复制代码
# 安装 ntp
yum -y install ntp

# 启动并设置开机自启
systemctl start ntpd
systemctl enable ntpd
# 当 ntpd 启动后会定期的帮助我们联网校准系统的时间

# 手动校准(需 root 权限)
ntpdate -u ntp.aliyun.com

5.4 IP 地址与主机名

IP 地址

每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯。

  • IP 地址主要有 2 个版本,V4 版本和 V6 版本(V6 很少用)
  • IPv4 版本的地址格式是:a.b.c.d,其中 abcd 表示 0~255 的数字,如 192.168.88.101 就是一个标准的 IP 地址
  • 127.0.0.1,这个 IP 地址用于指代本机
  • 0.0.0.0,特殊 IP 地址:可以用于指代本机;可以在端口绑定中用来确定绑定关系;在一些 IP 地址限制中,表示所有 IP 的意思

通过命令:ifconfig,查看本机的 IP 地址,如无法使用 ifconfig 命令,可以安装:yum -y install net-tools

主机名

每一台电脑除了对外联络地址(IP 地址)以外,也可以有一个名字,称之为主机名。

复制代码
# 查看主机名
hostname

# 修改主机名(需 root)
hostnamectl set-hostname 主机名

5.5 域名解析(主机名映射)

可以通过主机名找到对应计算机的 IP 地址,这就是主机名映射(域名解析)。先通过系统本地的记录去查找,如找不到就联网去公开 DNS 服务器去查找。

访问 www.baidu.com 的域名解析流程图:

复制代码
访问          检查                                 判断   是  打开网站
www.baidu.com → Windows: C:\Windows\System32\drivers\etc\hosts → ──────→ ──→
              → Linux: /etc/hosts                              ↓否
              是否有 www.baidu.com 的 IP 地址记录               联网查询公开DNS服务器
                                                              是否有 www.baidu.com
                                                              的IP地址记录 → 判断
                                                                         ↓否
                                                                      网站不存在

hosts 文件位置:

  • Windows:C:\Windows\System32\drivers\etc\hosts
  • Linux:/etc/hosts

Windows 清除 DNS 缓存:

复制代码
ipconfig /displaydns    // 显示 DNS 域名解析缓存
ipconfig /flushdns      // 手动清理 dns 缓存

5.6 虚拟机配置固定 IP

为什么需要固定 IP:

  • 当前虚拟机的 Linux 操作系统,其 IP 地址是通过 DHCP 服务获取的
  • DHCP:动态获取 IP 地址,即每次重启设备后都会获取一次,可能导致 IP 地址频繁变更

配置固定 IP 需要 2 个大步骤:

  1. 在 VMware Workstation(或 Fusion)中配置 IP 地址网关和网段(IP 地址的范围)
  2. 在 Linux 系统中手动修改配置文件,固定 IP

在 Linux 中修改配置文件:

使用 vim 编辑 /etc/sysconfig/network-scripts/ifcfg-ens33 文件,填入如下内容:

复制代码
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"          ← 由 dhcp 改为 static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
...
NAME="ens33"
UUID="f1ccb4a3-eecb-4f24-9cf0-97e6446f934b"
DEVICE="ens33"
ONBOOT="yes"                ← 注意 ONBOOT 要设置为 yes
# 新增如下内容:
IPADDR="192.168.88.130"     ← IP地址
NETMASK="255.255.255.0"     ← 子网掩码固定
GATEWAY="192.168.88.2"      ← 网关和 VMware 虚拟网络编辑器中设置的一致
DNS1="192.168.88.2"         ← DNS1 设置为网关即可

执行 systemctl restart network 重启网卡,执行 ifconfig 即可看到 IP 地址固定了。

5.7 网络请求

ping 命令

可以通过 ping 命令,检查指定的网络服务器是否是可联通状态。

复制代码
ping [-c num] ip或主机名
  • 选项:-c,检查的次数,不使用 -c 选项,将无限次数持续检查
  • 参数:ip 或主机名,被检查的服务器的 ip 地址或主机名地址
wget 命令

wget 是非交互式的文件下载器,可以在命令行内下载网络文件。

复制代码
wget [-b] url
  • 选项:-b,可选,后台下载,会将日志写入到当前工作目录的 wget-log 文件
  • 参数:url,下载链接
curl 命令

curl 可以发送 http 网络请求,可用于:下载文件、获取信息等。

复制代码
curl [-O] url
  • 选项:-O,用于下载文件,当 url 是下载链接时,可以使用此选项保存文件
  • 参数:url,要发起请求的网络地址

示例(查询公网 IP):

复制代码
[root@centos ~]# curl cip.cc
IP       : 111.12.191.105
地址     : 中国 青海 西宁
运营商   : 移动
...

5.8 端口

端口,是设备与外界通讯交流的出入口。端口可以分为:物理端口和虚拟端口两类。

  • 物理端口:又可称之为接口,是可见的端口,如 USB 接口、RJ45 网口、HDMI 端口等
  • 虚拟端口:是指计算机内部的端口,是不可见的,是用来操作系统和外部进行交互使用的

Linux 系统是一个超大号小区,可以支持 65535 个端口,这 6 万多个端口分为 3 类进行使用:

  • 公认端口:1~1023,通常用于一些系统内置或知名程序的预留使用,如 SSH 服务的 22 端口,HTTPS 服务的 443 端口。非特殊需要,不要占用这个范围的端口
  • 注册端口:1024~49151,通常可以随意使用,用于松散的绑定一些程序\服务
  • 动态端口:49152~65535,通常不会固定绑定程序,而是当程序对外进行网络链接时,用于临时使用

查看端口占用情况:

复制代码
# 安装 nmap
yum -y install nmap
# 查看指定 IP 开放的端口
nmap 被查看的IP地址

# 安装 netstat
yum -y install net-tools
# 查看指定端口的占用情况
netstat -anp | grep 端口号

netstat 选项说明:

  • -a:显示所有端口
  • -n:数字形式显示网络地址和端口号
  • -p:显示哪个进程在调用
  • -an:按一定顺序排列输出

5.9 防火墙

防火墙示意图:

复制代码
                    Linux 防火墙
mysql客户端  ──→  ┌──────────────────┐
                  │   关闭的端口 3306 │──→ mysqld/后台程序/守护进程/服务
xshell6      ──→  │                  │
                  │   打开的端口  22  │──→ SSHD
                  └──────────────────┘

firewall 指令(打开或关闭端口):

复制代码
# 打开端口
firewall-cmd --permanent --add-port=端口号/协议

# 关闭端口
firewall-cmd --permanent --remove-port=端口号/协议

# 重新载入,才能生效
firewall-cmd --reload

# 查询端口是否开放
firewall-cmd --query-port=端口号/协议

示例:

复制代码
# 开放 111 端口
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --reload

# 关闭 111 端口
firewall-cmd --permanent --remove-port=111/tcp
firewall-cmd --reload

5.10 scp 文件传输命令

1. 从本地将文件传输到服务器:

复制代码
scp 【本地文件的路径】 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】
# 示例:
scp /Users/mac_pc/Desktop/test.png root@192.168.1.1:/root

2. 从本地将文件夹传输到服务器:

复制代码
scp -r 【本地文件的路径】 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】
# 示例:
scp -r /Users/mac_pc/Desktop/test root@192.168.1.1:/root

3. 将服务器上的文件传输到本地:

复制代码
scp 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】 【本地文件的路径】
# 示例:
scp root@192.168.1.1:/data/wwwroot/default/111.png /Users/mac_pc/Desktop

4. 将服务器上的文件夹传输到本地:

复制代码
scp -r 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】 【本地文件的路径】
# 示例:
scp -r root@192.168.1.1:/data/wwwroot/default/test /Users/mac_pc/Desktop

5.11 上传与下载

在 FinalShell 下方找到需要下载的文件右键点击下载即可下载到本机桌面的 fsdownload 文件夹中,将文件拖拽到 FinalShell 中想要上传的文件夹中上传,注意用户切换。

rz/sz 命令:

rz、sz 命令需要安装,可以通过:yum -y install lrzsz 即可安装。

  • rz 命令,进行上传,语法:直接输入 rz 即可(会弹出文件选择窗口)
  • sz 命令,进行下载,语法:sz 要下载的文件
  • 文件会自动下载到桌面的:fsdownload 文件夹中

5.12 压缩与解压

tar 命令

Linux 和 Mac 系统常用有 2 种压缩格式:

  • .tar,称之为 tarball,归档文件,即简单的将文件组装到一个 .tar 的文件内,并没有太多文件体积的减少,仅仅是简单的封装
  • .gz,也常见为 .tar.gz,gzip 格式压缩文件,使用 gzip 压缩算法将文件压缩到一个文件内,可以极大的减少压缩后的体积

针对这两种格式,使用 tar 命令均可以进行压缩和解压缩的操作。

复制代码
tar [-c -v -x -f -z -C] 参数1 参数2 ... 参数N
选项 说明
-c 创建压缩文件,用于压缩模式
-v 显示压缩、解压过程,用于查看进度
-x 解压模式
-f 要创建的文件,或要解压的文件,-f 选项必须在所有选项中位置处于最后一个
-z gzip 模式,不使用 -z 就是普通的 tarball 格式
-C 选择解压的目的地,用于解压模式

注意:

  • -z 选项如果使用的话,一般处于选项位第一个
  • -f 选项,必须在选项位最后一个
  • -C 选项单独使用,和解压所需的其它参数分开

常用示例:

复制代码
# 压缩 a.txt b.txt c.txt 到 test.tar.gz
tar -zcvf test.tar.gz a.txt b.txt c.txt

# 压缩文件夹 test 到 test.tar.gz
tar -zcvf test.tar.gz test/

# 解压 test.tar.gz 到当前目录
tar -zxvf test.tar.gz

# 解压 test.tar.gz 到指定目录 /home/
tar -zxvf test.tar.gz -C /home/
zip/unzip 命令
复制代码
# 压缩为 zip
zip [-r] 参数1 参数2 ... 参数N
# -r,被压缩的包含文件夹的时候,需要使用 -r 选项

# 示例
zip test.zip a.txt b.txt c.txt     # 将 a.txt b.txt c.txt 压缩到 test.zip 文件内
zip -r test.zip test itheima a.txt  # 将 test、itheima 两个文件夹和 a.txt 文件,压缩到 test.zip 文件内

# 解压 zip
unzip [-d] 参数
# -d,指定要解压去的位置,同 tar 的 -C 选项

# 示例
unzip test.zip -d /home/  # 解压 test.zip 到 /home/ 目录

六、软件安装与服务管理

6.1 RPM 包管理

rpm 用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中。它生成具有 .RPM 扩展名的文件。RPM 是 RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似 Windows 的 setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的。

RPM 常用命令:

复制代码
# 查询所有安装的 rpm 软件包
rpm -qa
rpm -qa | more
rpm -qa | grep X   # 如 rpm -qa | grep firefox

# 查询软件包是否安装
rpm -q 软件包名    # 如 rpm -q firefox

# 查询软件包信息
rpm -qi 软件包名   # 如 rpm -qi firefox

# 查询软件包中的文件
rpm -ql 软件包名   # 如 rpm -ql firefox

# 查询文件所属的软件包
rpm -qf 文件全路径名   # 如 rpm -qf /etc/passwd

# 卸载 rpm 包
rpm -e RPM包的名称   # 如 rpm -e firefox

# 安装 rpm 包
rpm -ivh RPM包全路径名称
# i=install 安装, v=verbose 提示, h=hash 进度条

6.2 yum 命令

yum:RPM 包软件管理器,用于自动化安装配置 Linux 软件,并可以自动解决依赖问题。

复制代码
yum [-y] [install | remove | search] 软件名称
  • 选项:-y,自动确认,无需手动确认安装或卸载过程
  • install:安装
  • remove:卸载
  • search:搜索

yum 命令需要 root 权限,可以 su 切换到 root,或使用 sudo 提权。yum 命令需要联网。

6.3 apt 命令(Ubuntu)

前面学习的各类 Linux 命令,都是通用的。但是软件安装,CentOS 系统和 Ubuntu 使用不同的包管理器:

  • CentOS.rpm,yum

  • Ubuntu.deb,apt

    apt [-y] [install | remove | search] 软件名称

    用法和 yum 一致,同样需要 root 权限

    示例

    apt install wget # 安装 wget
    apt remove wget # 移除 wget
    apt search wget # 搜索 wget

6.4 systemctl 命令

Linux 系统很多软件(内置或第三方)均支持使用 systemctl 命令控制:启动、停止、开机自启。

能够被 systemctl 管理的软件,一般也称之为:服务

复制代码
systemctl start | stop | status | enable | disable 服务名
操作 说明
start 启动
stop 关闭
status 查看状态
enable 开启开机自启
disable 关闭开机自启

系统内置的服务:

  • NetworkManager:主网络服务
  • network:副网络服务
  • firewalld:防火墙服务
  • sshd:ssh 服务(FinalShell 远程登录 Linux 使用的就是这个服务)

第三方软件也可以通过 systemctl 控制:

复制代码
yum install -y ntp    # 安装 ntp 软件
# 可以通过 ntpd 服务名,配合 systemctl 进行控制

yum install -y httpd  # 安装 apache 服务器软件
# 可以通过 httpd 服务名,配合 systemctl 进行控制

systemctl 管理的服务在 /usr/lib/systemd/system 查看

设置服务的自启动状态:

复制代码
systemctl list-unit-files [| grep 服务名]    # 查看服务开机启动状态
systemctl enable 服务名                      # 设置服务开机启动
systemctl disable 服务名                     # 关闭服务开机启动
systemctl is-enabled 服务名                  # 查询某个服务是否是自启动的

注意:

  1. 关闭或者启用防火墙后,立即生效(telnet 测试某个端口即可)
  2. 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
  3. 如果希望设置某个服务自启动或关闭永久生效,要使用 systemctl [enable|disable] 服务名

七、进程管理与系统监控

7.1 ps 命令

在 Linux 中,可以通过 ps 命令查看运行中的进程。

复制代码
ps [-e -f]
  • 选项:-e,显示出全部的进程
  • 选项:-f,以完全格式化的形式展示信息(展示全部信息)

结合管道使用:

复制代码
ps -ef | grep tail    # 准确找到 tail 命令的信息
ps -aux | grep xxx    # 查看某个进程,如 sshd

ps -ef 输出字段说明(BSD 风格):

字段 说明
UID 用户 ID
PID 进程 ID
PPID 父进程 ID
C CPU 用于计算执行优先级的因子(数值越大,表明进程是 CPU 密集型运算;数值越小,表明进程是 I/O 密集型运算)
STIME 进程启动的时间
TTY 完整的终端名称
TIME CPU 时间
CMD 启动进程所用的命令和参数

ps -aux 输出字段说明(System V 风格):

字段 说明
USER 用户名称
PID 进程号
%CPU 进程占用 CPU 的百分比
%MEM 进程占用物理内存的百分比
VSZ 进程占用的虚拟内存大小(单位:KB)
RSS 进程占用的物理内存大小(单位:KB)
TT 终端名称,缩写
STAT 进程状态:S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止
STARTED 进程的启动时间
TIME CPU 时间
COMMAND 启动进程所用的命令和参数,如果过长会被截断显示

7.2 kill 命令

复制代码
kill [-9] 进程ID
  • 选项:-9,表示强制关闭进程。不使用此选项会向进程发送信号要求其关闭,但是否关闭看进程自身的处理机制

    通过进程名称杀死进程,也支持通配符

    killall 进程名称

7.3 pstree 命令

复制代码
pstree [选项]   # 可以更加直观的来看进程信息
# 常用选项:
# -p:显示进程的 PID
# -u:显示进程的所属用户

7.4 top 命令(系统监控)

可以通过 top 命令查看 CPU、内存使用情况,类似 Windows 的任务管理器。

默认每 5 秒刷新 一次,语法:直接输入 top 即可,按 qctrl + c 退出。

top 输出解读:

复制代码
top - 14:39:58 up 6 min, 2 users, load average: 0.06, 0.17, 0.13
  • top:命令名称

  • 14:39:58:当前系统时间

  • up 6 min:启动了 6 分钟

  • 2 users:2 个用户登录

  • load average: 0.06, 0.17, 0.13:1、5、15 分钟负载

    Tasks: 175 total, 1 running, 174 sleeping, 0 stopped, 0 zombie

175 个进程,1 个 running,174 个 sleeping,0 个停止进程,0 个僵尸进程

复制代码
%Cpu(s): 0.3 us, 1.4 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
字段 说明
us 用户 CPU 使用率
sy 系统 CPU 使用率
ni 高优先级进程占用 CPU 时间百分比
id 空闲 CPU 率
wa IO 等待 CPU 占用率
hi CPU 硬件中断率
si CPU 软件中断率
st 强制等待占用 CPU 率

进程列表字段:

字段 说明
PID 进程 id
USER 进程所属用户
PR 进程优先级,越小越高
NI 负值表示高优先级,正表示低优先级
VIRT 进程使用虚拟内存,单位 KB
RES 进程使用物理内存,单位 KB
SHR 进程使用共享内存,单位 KB
S 进程状态(S 休眠,R 运行,Z 僵死状态,N 负数优先级,I 空闲状态)
%CPU 进程占用 CPU 率
%MEM 进程占用内存率
TIME+ 进程使用 CPU 时间总计,单位 10 毫秒
COMMAND 进程的命令或名称或程序文件路径

top 命令选项:

选项 说明
-p 只显示某个进程的信息
-d 设置刷新时间,默认是 5s
-c 显示产生进程的完整命令,默认是进程名
-n 指定刷新次数,如 top -n 3,刷新输出 3 次后退出
-b 以非交互非全屏模式运行,以批次的方式执行 top,一般配合 -n 指定输出几次统计信息,将输出重定向到指定文件,如 top -b -n 3 > /tmp/top.tmp
-i 不显示任何闲置(idle)或无用(zombie)的进程
-u 查找特定用户启动的进程

top 交互式选项(运行时按键):

按键 功能
h 显示帮助画面
c 显示产生进程的完整命令
f 选择需要展示的项目
M 根据驻留内存大小(RES)排序
P 根据 CPU 使用百分比大小排序(默认)
T 根据时间/累计时间排序
E 切换顶部内存显示单位
e 切换进程内存显示单位
l 切换显示平均负载和启动时间信息
i 不显示闲置或无用的进程
t 切换显示 CPU 状态信息
m 切换显示内存信息
u 然后输入"u"回车,再输入用户名,监视特定用户
k 然后输入"k"回车,再输入要结束的进程 ID 号,终止指定进程

7.5 磁盘状态监控

df 命令(查看磁盘使用情况):

复制代码
df [-h]
# -h,以更加人性化的单位显示

iostat 命令(查看 CPU、磁盘的相关信息):

复制代码
iostat [-x] [num1] [num2]
# -x,显示更多信息
# num1:数字,刷新间隔;num2:数字,刷新几次

iostat 输出字段说明:

字段 说明
rrqm/s 每秒这个设备相关的读取请求有多少被 Merge 了
wrqm/s 每秒这个设备相关的写入请求有多少被 Merge 了
rKB/s 每秒发送到设备的读取请求数(重要)
wKB/s 每秒发送到设备的写入请求数(重要)
await 每一个 IO 请求的处理的平均时间(单位是微秒毫秒)
%util 磁盘利用率(重要)

磁盘情况查询常用命令:

复制代码
# 统计 /opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l

# 统计 /opt 文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l

# 统计 /opt 文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l

# 统计 /opt 文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l

# 以树状显示目录结构(若没有 tree,则用 yum install tree 安装)
tree 目录

7.6 网络状态监控

sar 命令(查看网络相关统计):

复制代码
sar -n DEV num1 num2
# -n,查看网络,DEV 表示查看网络接口
# num1:刷新间隔(不填就查看一次结束),num2:查看次数(不填无限次数)

sar 输出字段说明:

字段 说明
IFACE 本地网卡接口的名称
rxpck/s 每秒钟接收的数据包
txpck/s 每秒钟发送的数据包
rxKB/S 每秒钟接收的数据包大小,单位为 KB
txKB/S 每秒钟发送的数据包大小,单位为 KB
rxcmp/s 每秒钟接收的压缩数据包
txcmp/s 每秒钟发送的压缩包
rxmcst/s 每秒钟接收的多播数据包

7.7 环境变量

环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。

在 Linux 系统中执行:env 命令即可查看当前系统中记录的环境变量。

环境变量是一种 KeyValue 型结构,如:

  • HOME: /home/itheima,用户的 HOME 路径
  • USER: itheima,当前的操作用户
  • PWD: /home/itheima,当前工作路径

$ 符号: 在 Linux 系统中,$ 符号被用于取"变量"的值。

复制代码
echo $PATH         # 取 PATH 环境变量的值并输出
echo ${PATH}ABC    # 和其它内容混合,通过 {} 标注取的变量是谁

PATH 的作用: PATH 记录了系统执行任何命令的搜索路径,路径之间以 : 隔开。当执行 cd 命令,就从第二个目录 /usr/bin 中搜索到了 cd 命令,并执行。

自定义环境变量:

复制代码
# 临时设置(当前会话有效)
export 变量名=变量值

# 永久生效
# 针对当前用户生效,配置在当前用户的:~/.bashrc 文件中
# 针对所有用户生效,配置在系统的:/etc/profile 文件中
# 并通过语法:source 配置文件,进行立刻生效,或重新登录生效

# 删除环境变量
unset 环境变量名

常用环境变量操作:

复制代码
export 变量名=变量值    # 将 shell 变量输出为环境变量/全局变量
source 配置文件        # 让修改后的配置信息立即生效
echo $变量名           # 查询环境变量的值

自定义 PATH(将自定义路径加入 PATH):

复制代码
export PATH=$PATH:/新路径   # 将新路径追加到 PATH 中

八、网络配置

8.1 NAT 网络原理

NAT 网络配置图:

复制代码
电脑 Windows
┌─────────────────────────────────────────┐
│                                          │
│  Linux虚拟机        vmnet8              │
│  192.168.2.131  ←→ 192.168.2.1  ──→  网关 ──→ 互联网
│                                          │        www.baidu.com
│                  无线网卡               │
│                  192.168.101.8  ──→  网关 ──→
└─────────────────────────────────────────┘

8.2 DNS 域名

  • Hosts 是什么:一个文本文件,用来记录 IP 和 Hostname(主机名)的映射关系
  • DNS(Domain Name System):就是域名系统,翻译过来就是域名系统,是互联网上作为域名和 IP 地址相互映射的一个分布式数据库

DNS 解析流程图:

复制代码
客户电脑 →(1)→ 电脑本地DNS缓存 →(2)→ hosts文件 →(3)→ 根域名服务器
  ↑(8)                                               ↓(3)
本地域名服务器 ←(4)→ 顶级(二级、三级..)域名服务器 ←(5)→
                ↓(6)
           权威域名服务器 →(7)→

Windows 清除 DNS 缓存:

复制代码
ipconfig /displaydns    // DNS 域名解析缓存
ipconfig /flushdns      // 手动清理 dns 缓存

九、磁盘管理

9.1 磁盘分区机制

原理介绍:

  1. Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux 中每个分区都是用来组成整个文件系统的一部分。
  2. Linux 采用了一种叫"载入"的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。

查看所有设备挂载情况:

复制代码
lsblk     # 或者
lsblk -f

输出示例:

复制代码
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0   17G  0 part /
sr0     11:0    1 1024M  0 rom

硬盘说明:

  1. Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘
  2. 对于 IDE 硬盘,驱动器标识符为 hdx~,其中 hd 表明分区所在设备的类型,x 为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),~ 代表分区,前四个分区用数字 1 到 4 表示,从 5 开始就是逻辑分区
  3. 对于 SCSI 硬盘则标识为 sdx~,SCSI 硬盘是用 sd 来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样

9.2 增加硬盘分区并挂载

虚拟机增加硬盘步骤:

步骤2:分区命令 fdisk /dev/sdb

复制代码
# 开始对 /sdb 分区
m   # 显示命令列表
p   # 显示磁盘分区,同 fdisk -l
n   # 新增分区
d   # 删除分区
w   # 写入并退出

说明:开始分区后输入 n,新增分区,然后选择 p,分区类型为主分区。两次回车默认剩余全部空间。最后输入 w 写入分区并退出,若不保存退出输入 q。

步骤3:格式化磁盘

复制代码
mkfs -t ext4 /dev/sdb1
# 其中 ext4 是分区类型

步骤4:挂载

复制代码
mount 设备名称 挂载目录
# 例如:
mount /dev/sdb1 /newdisk

# 卸载
umount 设备名称 或者 挂载目录
# 例如:
umount /dev/sdb1 或者 umount /newdisk

步骤5:永久挂载

通过修改 /etc/fstab 实现挂载,添加完成后执行 mount -a 即刻生效:

复制代码
/dev/sdb1                                /newdisk  ext4  defaults  0 0
UUID=12ae1cc1-09e0-42ce-b659-063df3e7c941  /       ext4  defaults  1 1
UUID=df4d64bd-981e-41eb-8f13-16ac20f037le  /boot   ext4  defaults  1 2
UUID=494c7f94-5656-45a3-b990-008c2b0e39b7  swap    swap  defaults  0 0

9.3 磁盘情况查询

复制代码
# 查询系统整体磁盘使用情况
df -h

# 查询指定目录的磁盘占用情况
du -h /目录
# -s 指定目录占用大小汇总
# -h 带计量单位
# -a 含文件
# --max-depth=1 子目录深度
# -c 列出明细的同时,增加汇总值

十、任务调度

10.1 crond 任务调度

任务调度:是指系统在某个时间执行的特定的命令或程序。

  • 系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等

  • 个别用户工作:个别用户可能希望执行某些程序,比如对 mysql 数据库的备份

    crontab [选项]

选项 说明
-e 编辑 crontab 定时任务
-l 查询 crontab 任务
-r 删除当前用户所有的 crontab 任务

快速入门:

设置任务调度文件:/etc/crontab。设置个人任务调度,执行 crontab -e 命令,接着输入任务到调度文件。

如:*/1 * * * * ls -l /etc/ > /tmp/to.txt,意思是每小时的每分钟执行 ls -l /etc/ > /tmp/to.txt 命令。

5 个占位符的说明(参数细节说明):

项目 含义 范围
第一个 * 一小时当中的第几分钟 0-59
第二个 * 一天当中的第几小时 0-23
第三个 * 一个月当中的第几天 1-31
第四个 * 一年当中的第几月 1-12
第五个 * 一周当中的星期几 0-7(0 和 7 都代表星期日)

特殊符号说明:

特殊符号 含义
* 代表任何时间。比如第一个 * 就代表一小时中每分钟都执行一次
, 代表不连续的时间。如 0 8,12,16 * * * 命令,代表每天的 8 点 0 分,12 点 0 分,16 点 0 分都执行一次命令
- 代表连续的时间范围。如 0 5 * * 1-6 命令,代表在周一到周六的凌晨 5 点 0 分执行命令
*/n 代表每隔多久执行一次。如 */10 * * * * 命令,代表每隔 10 分钟就执行一遍命令

重启任务调度:

复制代码
service crond restart

10.2 at 任务调度机制

at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。

  1. at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
  2. 默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
  3. 在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看:ps -ef | grep atd

atd 工作原理图:

复制代码
         job队列
atd   →  ─────────
每60秒     job1
对每个      1. 指令/
作业执行    2. shell脚本
一次       job2
           ...

at [选项] [时间]
# Ctrl + D 结束 at 命令的输入

at 选项说明:

选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq 的别名
-d atrm 的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-f <文件> 从指定文件读入任务而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交要运行的任务

at 指定时间的方法:

  1. 接受在当天的 hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00
  2. 使用 midnight(深夜)、noon(中午)、teatime(下午 4 点)等比较模糊的词语来指定时间
  3. 采用 12 小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午。例如:12pm
  4. 指定命令执行的具体日期,指定格式为 month day(月 日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-03-1
  5. 使用相对计时法。指定格式为:now + count time-units,now 就是当前时间,time-units 是时间单位(minutes/hours/days/weeks)。例如:now + 5 minutes
  6. 直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间

at 使用示例:

复制代码
# 案例1:2天后的下午5点执行 /bin/ls /home
at 5pm + 2 days
at> /bin/ls /home<EOT>

# 案例2:atq 命令来查看系统中没有执行的工作任务

# 案例3:明天17点钟,输出时间到指定文件内
at 5pm tomorrow
at> date > /root/date100.log<EOT>

# 案例4:2分钟后,输出时间到指定文件内
at now + 2 minutes
at> date > /root/date200.log<EOT>

# 案例5:删除已经设置的任务
atrm 5

十一、服务管理(旧版)

11.1 服务介绍

服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld、sshd 防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。

11.2 service 命令

复制代码
service 服务名 [start | stop | restart | reload | status]

在 CentOS 7.0 后,很多服务不再使用 service,而是 systemctl(已在前面专门讲)。service 指令管理的服务在 /etc/init.d 查看。

查看服务名:

  • 方式1:使用 setup -> 系统服务 就可以看到全部
  • 方式2:/etc/init.d 看到 service 指令管理的服务

11.3 服务运行级别

Linux 系统有 7 种运行级别(runlevel),常用的是级别 3 和 5

运行级别 说明
0 系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
1 单用户工作状态,root 权限,用于系统维护,禁止远程登陆
2 多用户状态(没有 NFS),不支持网络
3 完全的多用户状态(有 NFS),无界面,登陆后进入控制台命令行模式
4 系统未使用,保留
5 X11 控制台,登陆后进入图形 GUI 模式
6 系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动

开机的流程说明:

复制代码
开机 → BIOS → /boot → systemd进程1 → 运行级别 → 运行级对应的服务

11.4 chkconfig 命令

通过 chkconfig 命令可以给服务的各个运行级别设置自启动/关闭。

  • chkconfig 指令管理的服务在 /etc/init.d 查看

  • 注意:Centos 7.0 后,很多服务使用 systemctl 管理

    查看服务

    chkconfig --list [| grep xxx]
    chkconfig 服务名 --list

    设置某个运行级别开关

    chkconfig --level 5 服务名 on/off

    案例:对 network 服务进行各种操作,把 network 在 3 运行级别,关闭自启动

    chkconfig --level 3 network off
    chkconfig --level 3 network on

使用细节: chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 生效。


十二、Shell 脚本编程

12.1 Shell 脚本介绍

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

Shell 架构图:

复制代码
┌─────────────────────────┐
│  外层应用程序            │
│  ┌───────────────────┐  │
│  │  Shell(命令解释器)│  │
│  │  ┌─────────────┐  │  │
│  │  │    内核      │  │  │
│  │  │  ┌───────┐  │  │  │
│  │  │  │  硬件  │  │  │  │
│  │  │  └───────┘  │  │  │
│  │  └─────────────┘  │  │
│  └───────────────────┘  │
└─────────────────────────┘

脚本格式要求:

  1. 脚本以 #!/bin/bash 开头
  2. 脚本需要有可执行权限

编写第一个 Shell 脚本: 需求说明:创建一个 Shell 脚本,输出 hello world!

脚本的常用执行方式:

  • 方式1 (输入脚本的绝对路径或相对路径):首先要赋予 helloworld.sh 脚本的 +x 权限,再执行脚本

  • 方式2sh + 脚本):不用赋予脚本 +x 权限,直接执行即可

    #!/bin/bash
    echo "hello world!"

12.2 Shell 变量

Shell 变量介绍:

  1. Linux Shell 中的变量分为,系统变量和用户自定义变量
  2. 系统变量:$HOME$PWD$SHELL$USER 等等,比如:echo $HOME
  3. 显示当前 shell 中所有变量:set

shell 变量的定义:

复制代码
# 定义变量:变量=值(注意:等号两侧不能有空格)
A=100

# 撤销变量:unset 变量
unset A

# 声明静态变量:readonly 变量,注意:不能 unset
readonly B=2

定义变量的规则:

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  2. 等号两侧不能有空格
  3. 变量名称一般习惯为大写

将命令的返回值赋给变量:

复制代码
A=`date`        # 反引号,运行里面的命令,并把结果返回给变量 A
A=$(date)       # 等价于反引号

示例代码:

复制代码
#!/bin/bash
# 案例1:定义变量 A
A=100
# 输出变量需要加上 $
echo A=$A
echo "A=$A"
# 案例2:撤销变量 A
unset A
echo "A=$A"
# 案例3:声明静态的变量 B=2,不能 unset
readonly B=2
echo "B=$B"
unset B   # 会报错

12.3 设置环境变量

复制代码
export 变量名=变量值    # 将 shell 变量输出为环境变量/全局变量
source 配置文件        # 让修改后的配置信息立即生效
echo $变量名           # 查询环境变量的值

快速入门:

  1. /etc/profile 文件中定义 TOMCAT_HOME 环境变量
  2. 查看环境变量 TOMCAT_HOME 的值
  3. 在另外一个 shell 程序中使用 TOMCAT_HOME

注意: 在输出 TOMCAT_HOME 环境变量前,需要让其生效:source /etc/profile

12.4 位置参数变量

当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。

比如:./myshell.sh 100 200,这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息。

复制代码
$n    # n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10}
$*    # 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体
$@    # 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待
$#    # 这个变量代表命令行中所有参数的个数

12.5 预定义变量

就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用。

复制代码
$$    # 当前进程的进程号(PID)
$!    # 后台运行的最后一个进程的进程号(PID)
$?    # 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了

12.6 运算符

复制代码
# 语法
"$((运算式))" 或 "$[运算式]" 或者 expr m + n
# 注意 expr 运算符间要有空格,如果希望将 expr 的结果赋给某个变量,使用反引号
expr m - n
expr \*, /, %    # 乘,除,取余

# 案例1:计算(2+3)×4 的值
# 方式一
RES1=$(((2+3)*4))
echo "res1=$RES1"
# 方式二(推荐使用)
RES2=$[(2+3)*4]
echo "res2=$RES2"
# 方式三(使用 expr)
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"

# 案例2:请求出命令行的两个参数[整数]的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"

12.7 条件判断

复制代码
# 基本语法
[ condition ]   # 注意 condition 前后要有空格
# 非空返回 true,可使用 $? 验证(0 为 true,>1 为 false)

# 应用实例
[ hspEdu ]            # 返回 true
[ ]                   # 返回 false
[ condition ] && echo OK || echo notok    # 条件满足,执行后面的语句

常用判断条件:

1) 字符串比较: =

2) 两个整数的比较:

操作符 说明
-lt 小于(less than)
-le 小于等于(little equal)
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

3) 按照文件权限进行判断:

  • -r:有读的权限
  • -w:有写的权限
  • -x:有执行的权限

4) 按照文件类型进行判断:

  • -f:文件存在并且是一个常规的文件
  • -e:文件存在
  • -d:文件存在并是一个目录

if 判断语法:

复制代码
# 基本语法1
if [ 条件判断式 ]
then
    代码
fi

# 基本语法2(多分支)
if [ 条件判断式 ]
then
    代码
elif [ 条件判断式 ]
then
    代码
fi
# 注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格

示例:

复制代码
#!/bin/bash
# 案例1:"ok" 是否等于 "ok"(使用 =)
if [ "ok" = "ok" ]
then
    echo "equal"
fi

# 案例2:23 是否大于等于 22(使用 -ge)
if [ 23 -ge 22 ]
then
    echo "大于"
fi

# 案例3:/root/shcode/aaa.txt 目录中的文件是否存在(使用 -f)
if [ -f /root/shcode/aaa.txt ]
then
    echo "存在"
fi

12.8 case 语句

复制代码
case $变量名 in
"值1")
    如果变量的值等于值1,则执行程序1
;;
"值2")
    如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
    如果变量的值都不是以上的值,则执行此程序
;;
esac

示例:

复制代码
#!/bin/bash
# 案例1:当命令行参数是 1 时,输出"周一", 是 2 时,就输出"周二",其它情况输出 "other"
case $1 in
"1")
    echo "周一"
;;
"2")
    echo "周二"
;;
*)
    echo "other..."
;;
esac

12.9 for 循环

复制代码
# 基本语法1
for 变量 in 值1 值2 值3...
do
    程序
done

# 基本语法2
for (( 初始值;循环控制条件;变量变化 ))
do
    程序
done

$*$@ 的区别:

复制代码
#!/bin/bash
# 案例1:打印命令行输入的参数(这里可以看出 $* 和 $@ 的区别)
# 注意 $* 是把输入的参数,当做一个整体,所以,只会输出一句
for i in "$*"
do
    echo "num is $i"
done
# 使用 $@ 来获取输入的参数,注意,这时是分别对待,所以有几个参数,就输出几句
echo "======================================"
for j in "$@"
do
    echo "num is $j"
done

运行示例:

复制代码
./testFor1.sh 100 200 300
num is 100 200 300
======================================
num is 100
num is 200
num is 300

案例:从1加到100:

复制代码
#!/bin/bash
# 案例1:从 1 加到 100 的值输出显示
SUM=0
for (( i=1; i<=$1; i++ ))
do
    SUM=$[$SUM+$i]
done
echo "总和 SUM=$SUM"

12.10 while 循环

复制代码
# 基本语法
while [ 条件判断式 ]
do
    程序
done

示例:

复制代码
#!/bin/bash
# 案例1:从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
    SUM=$[$SUM+$i]
    # i 自增
    i=$[$i+1]
done
echo "执行结果=$SUM"

12.11 read 读取控制台输入

复制代码
read (选项)(参数)
# 选项:
# -p:指定读取值时的提示符
# -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
# 参数:变量:指定读取值的变量名

示例:

复制代码
#!/bin/bash
# 案例1:读取控制台输入一个 NUM1 值
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"

# 案例2:读取控制台输入一个 NUM2 值,在 10 秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

12.12 函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。

系统函数

basename 基本语法:

复制代码
basename [pathname] [suffix]
basename [string] [suffix]
# 功能:basename 命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来
# suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉

# 案例1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
basename /home/aaa/test.txt
# 输出:test.txt

dirname 基本语法:

复制代码
dirname 文件绝对路径
# 功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

# 案例1:请返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
# 输出:/home/aaa
自定义函数
复制代码
# 基本语法
[ function ] funname[()]
{
    Action;
    [return int;]
}
# 调用直接写函数名:funname [值]

示例:

复制代码
#!/bin/bash
# 案例1:计算输入两个参数的和(动态的获取),getSum
# 定义函数 getSum
function getSum() {
    SUM=$[$n1+$n2]
    echo "和是=$SUM"
}
# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
# 调用自定义函数
getSum $n1 $n2