封面来源:本文封面来源于网络,如有侵权,请联系删除。

本文参考:【小白入门 通俗易懂】2021 韩顺平 一周学会Linux

0. 环境准备

在学习 Linux 前,肯定是需要一台拥有 Linux 操作系统的机子,可以是真机、也可以是虚拟机、还可以是各厂商的服务器(比如阿里云、腾讯云、华为云等)。为了简单起见,我在此选择使用阿里云的云服务器(ECS)。

首先需要购买一个云服务器,学习阶段并不需要高配置的云服务器,选择 1 核 2G 1M 40G 的最便宜的即可(建议在 618 或双 11 时购买,配合学生认证更加便宜)。

0.1 Xshell 连接 ECS

好的,你已经有一台云服务器,那我们肯定不能直接在阿里云的网页上进行操作嘛,所以需要一个终端模拟软件来连接 ECS 以便我们可以更好地操作,在这我选择 NetSarang 的 Xshell 作为终端模拟软件来连接阿里云 ECS。

阿里云 ECS 的设置

先问问自己是否知道 ECS 的实例密码,如果不知道,需要先重置实例密码,这个密码后续会用到。

重置ECS实例密码

点击“重置实例密码”后,跟随步骤一步步完成即可。

然后再配置安全组,点击上图中“重置实例密码”旁的“配置安全组规则”,进入安全组列表:

ECS安全组列表

点击“配置规则”进入安全组配置列表,然后添加 入方向 的安全组规则:

新增入方向安全组规则

注意: 协议类型选择 自定义 TCP,端口范围选择 22,授权对象可以按情况填写,当然也可设置为 0.0.0.0/0 表示允许所有 IP 访问。

Xshell 的配置

当然,首先得安装 Xshell。点击此连接:免费的许可证,然后输入姓名和邮箱,选择“两者”,最后点击下载。

Xshell和Xftp免费的许可证

点击“下载”页面跳转后,会给你填写的邮箱内发送两封邮件,这些邮件里有 Xshell 和 Xftp 的下载链接,点击链接进行下载即可。

下载完安装包后进行软件安装,软件安装完毕后,打开 Xshell 并新建会话属性:

Xshell新建会话属性

上图中红框中的内容都需要填写,协议和端口号与上图一致,名称可以和主机同名,主机就是 ECS 的 公网 IP

然后点击左侧的“用户身份验证”,输入用户名和密码,用户名一般都是 root,密码就是前文重置后的实例密码,方法选择 password 即可。填写完毕后点击连接。

Xshell会话用户身份验证

如果是第一次连接此 ECS,会出现安全提示(SSH 安全警告),提示 xxx 主机的密钥未在本地主机密钥数据库中注册,这时候点击“接收并保存”即可。

如果 Xshell 界面出现“Connection established”的字样,就表示连接成功;如果连接失败,检查下 IP、端口、账号、密码、安全组配置是否正确。

0.2 第一次连接出现的问题

使用 Xshell 第一次连接 ECS 时,可能需要连接多次,连接成功后可能会在界面上出现:

WARNING!The remote SSH server rejected X11 forwarding request.

解决方法

输入命令:

1
vi /etc/ssh/sshd_config

按下键盘上的 i 进入编辑模式。修改 X11Forwardingyes,再将 UseLogin 参数为 no,然后按下键盘上的 ESC 键,输入 :wq! 退出编辑器。

修改完成后,重启 ssh 服务:

1
systemctl restart sshd

再次连接,如果还是出现 Warning,安装 xorg-x11-xauth 的 rpm 包(X11Forwarding 需要依赖 xorg-x11-xauth 软件包):

1
yum install xorg-x11-xauth

安装完毕后,再次连接。

到此,警告的问题基本就解决了。

0.3 虚拟机分区

一般来说,我们会对 Linux 进行分区, 分为三个部分:

1、boot 分区,引导分区,大约需要 1G

2、swap 分区,交换分区,一般来说与内存一致(2G)

3、/ 分区,根分区,余下的磁盘容量(40G - 1G - 2G = 37G)

1. 目录结构

1.1 目录结构概述

Linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。

记住:在 Linux 世界里,一切皆文件。

Linux目录结构示例

1.2 具体的目录结构

/bin【常用】

比如:/usr/bin、/usr/local/bin 等。

是 Binary 的缩写,这里存放着经常使用的命令。

/sbin

比如:/usr/sbin、/usr/local/sbin 等

s 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序。

/home【常用】

存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名。

也称为“家目录”、“用户目录”,和 Windows 系统盘下的“用户目录”类似。

/root【常用】

该目录为系统管理员,也称作超级权限者的用户主目录。

/lib

系统开机所需要的最基本的动态连接共享库,其作用类似于 Windows 中的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found

这个目录一般情况下是空的,当系统非法关机后,这里将存放一些文件。

/etc【常用】

所有系统管理所需要的配置文件和子目录,比如 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【常用】

Linux 提供该目录是为了让用户临时挂载别的文件系统,我们可以将外部的存储挂载到 /mnt/ 上,然后进入该目录就可以查看到外部存储的内容了。

/opt

这是存放主机额外安装的软件的目录,默认为空。比如安装 Oracle 数据库就可以放到该目录下。

/usr/local【常用】

这是存放主机额外安装的软件的另一个目录,一般是存放通过编译源码的方法来安装的程序。

/var【常用】

该目录存放着不断扩充的文件,习惯性地将经常被修改的文件放在这个目录下,比如各种日志文件。

/selinux

Security-Enhanced Linux,SELinux 是一种安全子系统,它能控制程序只访问特定的文件,有三种工作模式,可以自行设置。

2. Vi 和 Vim 编辑器

2.1 Vi 和 Vim 的概述

Linux 系统会内置 Vi 文本编辑器。

Vim 具有程序编辑的能力,可以看做是 Vi 的增强版,可以主动地以字体颜色辨别语法的正确性,方便程序设计。代码补全、编辑及错误跳转等方便编程的功能非常丰富。

2.2 常用的三种模式

正常模式(一般模式)

以 Vim 打开一个档案就直接进入了正常模式(这也是默认,或者说一般的模式)。在这个模式中,可以使用上、下、左、右按键来移动光标,可以使用使用删除字符或删除整行来处理档案内容,也可以使用复制、粘贴来处理文件数据。

在 Linux 命令行下输入以下命令,即可进入正常(一般)模式:

1
vim 需要被编辑的文件(包括后缀)

插入模式

进入正常模式后,按下 i、I、o、O、a、A、r、R 等任何一个字母后才会进入编辑模式,一般来说更习惯按下 i。

处于插入模式时,如果键入 ESC 即可重新返回至一般模式。

命令行模式

在这个模式下,可以提供相关指令以完成读取、存盘、替换、离开 Vim、显示行号等动作。

处于一般模式时,输入 :/ 即可进入命令模式。

处于命令行模式时,如果键入 ESC 即可重新返回至一般模式。

在命令行模式下,继续输入 wq 即可完成保存退出;输入 q 完成退出,但不保存;输入 q! 完成强制退出,但不保存。

2.3 Vi 和 Vim 的快捷键

1、拷贝当前行:yy,拷贝当前行向下的 5 行:5yy,并粘贴(输入 p);

2、删除当前行:dd,删除当前行向下的 5 行:5dd

3、在文件中查找某个单词(区分大小写):在 命令行 下,输入 /关键字,键入 回车 后查找,输入 n 就是查找下一个;

4、设置文件的行号::set nu,取消文件的行号::set nonu,其中冒号表示进入 命令行 模式;

5、编辑 /etc/profile 文件,在 一般模式 下,使用快捷键到该文档的最末行 G 和最首行 gg(这些命令区分大小写);

6、在文件中输入字符后又撤销:在 一般模式 下输入 u

7、在一般模式下,快速定位到某一行:行号 shift g 或者 行号 gg 或者 行号 G

更多快捷键查看:Linux vi/vim 菜鸟教程

Vi和Vim键盘图

3. 开机重启与登录注销

3.1 关机与重启

立刻进行关机:

1
shutdown -h now

1 分钟后进行关机:

1
shutdown -h 1

立刻重启计算机:

1
shutdown -r now

立刻关机:

1
halt

立刻重启计算机:

1
reboot

把内存的数据同步到磁盘:

1
sync

注意

1、不管是重启系统还是关闭系统,建议都先执行 sync 命令将内存中的数据写到磁盘中;

2、虽然目前的 shutdownreboothalt 命令均已在关机前执行了 sync 命令,但记住:小心驶得万年船。

3.2 用户登录与注销

登录时尽量少用 root 账号登录,因为它是系统管理员,拥有最大的权限,避免操作失误。建议利用普通用户登录,登录后在使用 su -用户名 命令并输入相应的密码(此时的密码不会回显)来切换成系统管理员身份。

在提示符下输入 logout 即可注销当前用户。如果当前用户是由某一个用户切换而来(使用 su),输入命令后会返回至上一用户。

输入以下命令,可完成用户的切换:

1
su -用户名

注意: logout 注销指令在图形运行级别无效,在运行级别 3 下才有效。

4. 用户管理

Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户都必须首先向系统申请一个账号,然后以这个账号的身份进入系统。

4.1 添加用户

基本语法

1
useradd 用户名

比如:

1
useradd mofan

咱们可以切到 home 目录下,查看该目录下是否存在名为 mofan 的目录:

1
2
cd home # 切到 home 目录下
ls # 查看 home 目录下的文件信息

细节说明

1、当创建用户成功后,会自动创建和用户名同名的家目录,默认该用户的家目录为 /home/用户名

2、也可以通过以下方式给新创建的用户指定家目录:

1
useradd -d 指定目录 用户名

4.2 指定 / 修改密码

创建了用户之后,应该给用户设置一个密码,其基本语法是:

1
passwd 用户名

注意: 如果不指定用户名,就是给当前登录的用户修改密码。

比如,给前面创建的 mofan 用户设置密码:

1
passwd mofan

输入这条指定后会让你输入你想指定的密码。如果你的密码少于 8 个字符,Linux 会提示你密码无效且少于 8 个字符,但是没有关系,它只是提醒你密码太简单,如果你再次输入密码,仍然会设置成功。

密码设置成功后,断开链接,像【0.1 Xshell 连接 ECS】一样设置会话的属性,只不过这次输入的用户名和密码是我们刚刚新添加和设置的用户与密码,填写完成后点击“连接”。

点击后可以顺利进入系统,如果输入 ls 指令,并不会显示什么,但如果输入 pwd 指令,会显示出(如果你创建用户没指定用户的家目录的话):

/home/当前用户名

其中,使用 pwd 指令可以 显示当前用户所在的目录

4.3 删除用户

用户可以添加当然也可以删除,其基本语法是:

1
userdel 用户名

需要注意的是,当前用户并不能删除当前用户。比如,当前用户是 mofan,然后又想删除 mofan 用户,这样当然是不行的,为此,我们可以登录 root 用户后进行删除。

登录 root 用户后,进行 mofan 用户的删除:

1
2
3
userdel mofan # 删除 mofan 用户
cd /home # 切换到 home 目录
ls # 查看当前目录下的文件信息

输入 ls 命令后,会发现 home 目录下还是有 mofan 文件夹的存在。这是为什么呢?

难道没删掉?输入 su mofan 切换至用户 mofan 试试。

输入命令后,显示以下信息:

su: user mofan does not exist

表示用户 mofan 并不存在。那为什么 home 目录下还存在 mofan 文件夹呢?

原来使用 userdel 用户名 的方式来删除用户会保留用户的家目录,那有没有什么办法可以“删干净”,不仅删除用户还删除家目录呢?输入以下命令即可:

1
userdel -r 用户名

注意: 这种删除的方式应当慎重! 一般情况下,建议保留家目录。

4.4 查询用户信息

如果想要查询用户用户信息,可以使用:

1
id 用户名

比如:

1
id root

那么我们将看到:

uid=0(root) gid=0(root) groups=0(root)

如果查询的用户信息不存在,将返回无此用户。

4.5 切换用户

在操作 Linux 中,如果当前用户的权限不够,可以通过 su - 指令切换到高权限用户。

从权限高的用户切换到权限低的用户时,不需要输入密码,但反之则需要。

当需要返回到原来的用户时,可以使用 exitlogout 指令。

比如创建一个名为 mofan 的用户,然后为其设置密码,并切换到此用户:

1
2
3
4
useradd mofan
passwd mofan
su - mofan # 无需输入密码
su - root # 再切换回 root 时,需要输入密码

4.6 查看当前用户信息

如果想要知道当前登录用户是谁,可以使用以下命令:

1
whoami # 或者 who am i

假设我先使用 root 用户执行命令 who am i,然后切换到 mofan 用户,此时再执行命令 who am i,那么此时得到的是 root 用户信息还是 mofan 用户呢?

最终依旧会得到 root 用户信息。由此可见 who am i 命令将显示第一次登录到系统的用户信息。

4.7 用户组

所谓用户组,其类似于角色,系统可对有共性、具有相同权限的多个用户进行统一的管理。

需要新增用户组时,执行以下命令:

1
groupadd 组名

需要删除用户组时,执行以下命令:

1
groupdel 组名

如果已经存在用户组,可以在新增用户的时候一并指定用户组:

1
useradd -g 用户组 用户名

而在前面,我们新增用户时没有具体指定用户组时,系统会在创建用户的同时再创建一个跟用户名相同的用户组,并将新增的用户添加到此用户组中。那如何验证呢?

可以使用 id 用户名 来查看,比如我们新增 mofan 用户时就没有指定具体的用户组,然后使用 id mofan 命令后,将输出:

uid=1000(mofan) gid=1000(mofan) groups=1000(mofan)

可以发现,uid、gid、groups 都一样,且都表示 mofan,证明我们说的没有错。

在新增用户的时候可以指定用户组,那么如何修改已经存在用户的用户组呢?

1
usermod -g 用户组 用户名

应用:创建用户组 wudang、mingjiao,创建用户 zwj(张无忌)并指定其用户组为 wudang,而后将其用户组更改为 mingjiao。

1
2
3
4
5
6
7
8
groupadd wudang
groupadd mingjiao
useradd -g wudang zwj
id zwj
# uid=1001(zwj) gid=1001(wudang) groups=1001(wudang)
usermod -g mingjiao zwj
id zwj
# uid=1001(zwj) gid=1002(mingjiao) groups=1002(mingjiao)

用户和组相关文件

1、/etc/passwd 文件:用户(user)的配置文件,记录用户的各种信息。

每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell

2、/etc/shadow 文件:口令的配置文件。

每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

3、/etc/group 文件:组(group)的配置文件,记录 Linux 包含的组的信息。

每行的含义:组名:口令:组标识号:组内用户列表

5. 实用指令

5.1 指定运行级别

运行级别介绍:

0:关机;

1:单用户【找回丢失密码】;

2:多用户状态没有网络服务;

3:多用户状态有网络服务;

4:系统未使用保留给用户;

5:图形界面;

6:系统重启;

常用运行级别是 3 和 5,也可以指定默认运行级别。

如果需要指定运行级别,可以使用 init 命令,比如:

1
init 6 # 系统重启

设置默认运行级别

查看当前运行级别:

1
systemctl get-default

设置默认运行级别:

1
2
systemctl set-default multi-user.target # 设置默认运行级别为 3
systemctl set-default graphical.target # 设置默认运行级别为 5

5.2 帮助指令

备注:本节应该是找回 root 密码的相关操作,但由于我采用阿里云 ECS 进行操作,因此省略找回 root 密码的相关操作。

如果需要获得帮助信息,可以使用 man 命令,基本语法是:

1
man [命令或配置文件]

比如,查看 ls 命令的帮助信息,那么应该执行 man ls

小知识: 在 Linux 中,隐藏文件是以 . 开头的。因此,查看当前目录下隐藏文件可以使用 ls -a。命令的选项可以组合使用,且不区分顺序,比如 ls -al 或者 ls -la,它们的效果是一样的。

如果想要获得 shell 内置命令的帮助信息,可以使用 help 命令,基本语法是:

1
help 命令

比如查看 cd 命令的帮助信息,可以使用 help cd

当然,最简单实用的方法还是百度。😂

5.3 文件目录类

pwdls

仅使用 pwd 指令(不带有任何选项)可以显示当前工作目录的绝对路径。

ls 指令可以显示某一目录下的文件信息,其基本语法是:

1
ls [选项] [目录或文件]

ls 指令常用的选项:

1、-a 显示当前目录下所有的文件和目录,包括隐藏的;

2、-l 以列表的形式显示信息。

小知识:如果想要将文件的大小信息更加人性化地显示,可以使用 ls -lh 指令。

cd

cd 指令可以切换到指定的目录,其基本语法是:

1
cd [参数]

使用 cd ~cd 命令可以回到当前用户的家目录;使用 cd / 命令切换到根目录; 使用 cd .. 可以回到当前目录的上一级目录。

使用 cd 命令需要重点理解相对路径和绝对路径。

mkdir

mkdir 指令用于创建目录,其基本语法是:

1
mkdir [选项] 要创建的目录名称

常用选项:

1、-p 创建多级目录。

使用示例:

1、在 home 目录下创建 dog 目录:mkdir /home/dog

2、在 home 目录下创建 animal 目录,在 animal 目录下创建 tiger 目录:mkdir -p /home/animal/tiger

rmdir

rmdir 指令用于删除空目录,其基本语法是:

1
rmdir [选项] 要删除的空目录

比如,删除 /home/dog 目录就需要使用 rmdir /home/dog

rmdir 指令是删除空目录的,如果要删除的目录下有内容则无法删除。如果要删除非空目录,需要使用 rm -rf 要删除的目录

touch

touch 指令用于创建空文件,其基本语法是:

1
touch 文件名称

cp

cp 指令用于拷贝文件到指定目录。其基本语法是:

1
cp [选项] source dest

常用选项:

1、-r 递归复制整个文件夹。

使用示例:

1、将 /home/hello.txt 拷贝到 /home/bbb 目录下:

1
cp /home/hello.txt /home/bbb

2、递归复制整个文件夹。比如将 /home/bbb 整个文件拷贝到 /opt 目录下:

1
cp -r /home/bbb /opt

使用细节:如果需要强制覆盖且不提示,可以使用 \cp 指令,比如:\cp -r /home/bbb /opt

rm

rm 指令用于移除文件或目录,其基本语法是:

1
rm [选项] 要删除的文件或目录

常用选项:

1、-r 递归删除整个文件夹;

2、-f 强制删除且不提示。

使用示例:

1、将 /home/hello.txt 文件删除:

1
rm /home/hello.txt

2、递归删除整个 /home/bbb 文件夹:

1
rm -r /home/bbb

mv

mv 指令用于移动文件与目录或者重命名。其基本语法是:

1
2
mv oldNameFile newNameFile # 重命名
mv /temp/movefile /targetFolder # 移动文件

移动与重命名的区别就是判断目标文件或目标文件夹是否存在,如果存在就是移动,反之则是重命名。

比如在 /home 目录下存在 cat.txt 文件,在 root 目录下 存在 dog.txt 文件,此时执行 mv /home/cat.txt /root/dog.txt 指令,表示将 cat.txt 文件移动到 root 目录下并重命名为 dog.txt。

cat

cat 指令可以查看文件内容(内容较少),其基本语法是:

1
cat [选项] 要查看的文件

常用选项:

1、-n 显示行号。

使用细节:cat 指令只能浏览文件而不能修改文件,为了浏览方便,一般会带上管道命令 | more

more

more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件内容。more 指令中内置了若干快捷键用于交互,如:

操作 功能说明
空格(space) 向下翻一页
Enter 向下翻一行
q 立即离开 more,不再显示该文件内容
Ctrl + f 向下滚动一屏
Ctrl + B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号

more 的基本语法是:

1
more 要查看的文件

less

less 指令用来分屏查看文件内容,它的功能与 more 指令相似,但是比 more 更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载后才显示的,而是根据需要加载内容,对于显示一些大型文件具有较高的效率。它也内置了若干快捷键用于交互,如:

操作 功能说明
空格(space) 向下翻一页
[pagedown] 向下翻一页
[pageup] 向上翻一页
/字符 向下搜寻【字符】。n:向下查找;N:向上查找
?字符 向上搜寻【字符】。n:向上查找;N:向下查找
q 离开 less

其基本语法是:

1
less 要查看的文件

echohead

echo 指令用于输出内容到控制台,其基本语法是:

1
echo [选项] [输出内容]

比如,查看当前主机名可以使用指令:echo $HOSTNAME

head 指令用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容。其基本语法是:

1
2
head 文件 # 查看文件前 10 行内容
head -n 5 文件 # 查看文件前 5 行内容,其中 5 可以是任意行数

tail

tail 指令用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的后 10 行内容。其基本语法是:

1
2
3
tail 文件 # 查看文件后 10 行内容
tail -n 5 文件 # 查看文件后 5 行内容,其中 5 可以是任意数字
tail -f 文件 # 实时追踪该文档的所有更新

>>>

> 表示输出重定向(覆写),>> 表示追加。它们的基本语法是:

1
2
3
4
ls -l > 文件 # 列表的内容覆写到文件中。如果文件不存在,则创建文件
ls -al >> 文件 # 列表的内容追加到文件的末尾
cat 文件1 > 文件2 # 将文件 1 的内容覆盖到文件 2 中
echo "内容" >> 文件 # 将指定的内容追加到文件中

使用示例:将当前日历信息追加到 /home/mycal 文件中,其中 mycal 文件并不存在。那么可以使用命令:

1
cal >> /home/mycal

ln

ln 指令用于创建软链接,或者说符号链接,类似于 Windows 里的快捷方式,主要存放了链接其他文件的路径。其基本语法是:

1
ln -s [原文件或目录] [软链接名] # 给原文件创建一个软链接

比方说我在 /home 目录下创建一个软链接 myroot,链接到 /root 目录,那么当我访问 myroot 时,就相当于访问 /root 目录。

使用示例:

1
2
ln -s /root/ /home/myroot # 在 /home 目录下创建一个软链接 myroot,链接到 /root 目录
rm /home/myroot # 删除软链接 myroot

当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在的目录。

history

history 指令用于查看已经执行过的历史指令,也可以执行历史指令。其基本语法是:

1
2
3
history # 查看已经执行过的历史指令
history 10 # 显示最近使用过的 10 个指令
!5 # 执行历史编号为 5 的指令

5.4 时间日期类

date

date 指令用于显示当前日期,其基本语法是:

1
2
3
4
5
date # 显示当前时间
date +%Y # 显示当前年份
date +%m # 显示当前月份
date +%d # 显示当前是哪一天
date "+%Y-%m-%d %H:%M:%S" # 显示年月日时分秒

还可以使用 date 指令来设置日期,其基本语法是:

1
date -s 字符串时间

cal

cal 指令可以查看日历,其基本语法是:

1
cal [选项] # 不加选项,显示本月日历

如果需要显示某一年的日历信息,只需要在指令后加上对应年份即可,比如我想查看 2021 年的日历,那么就可以输入指令:cal 2021

5.5 查找搜索类

find

find 指令可以从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端。其基本语法是:

1
find [搜索范围] [选项]

选项说明:

选项 功能
-name 查询方式 按照指定的文件名查找模式查找文件
-user 用户名 查找属于指定用户的所有文件
-size 文件大小 按照指定的文件大小查找文件

使用示例:

1、根据名称查找 /home 目录下的 hello.txt 文件:

1
find /home -name hello.txt

2、按拥有者查找 /opt 目录下,用户名为 nobody 的文件:

1
find /opt -user nobody

3、查找整个系统下大于 200M 的文件(提示: +n 大于 -n 小于 n 等于,其中 n 表示文件大小,其单位有 k、M、G):

1
find / -size +200M

如果查找出的文件过多,可以在指令后添加 | more 来显示信息。

locate

locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确性,管理员必须定期更新 locate 时刻。其基本语法是:

1
locate 搜索文件

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

遇到的问题:

如果在执行 uodatedb 指令是出现以下信息:

-bash updatedb: command not found

需要先执行以下命令安装 lcoate,:

1
yum install mlocate

安装完成后再执行 updatedb 指令即可。

which

which 指令可以查看某个指令在哪个文件夹下。其基本语法是:

1
which 指令

比如:which ls

grep|

grep 指令是过滤查找,其基本语法是:

1
grep [选项] 查找内容 源文件

常用选项:

选项 功能
-n 显示匹配行及行号
-i 忽略字母大小写
-A [n] 显示匹配行及 以下 n 行
-B [n] 显示匹配行及 以上 n 行
-C [n] 显示匹配行及 前后 n 行

| 是管道符,表示将前一个指令的处理结果输出传递给后面的命令处理。

使用示例:

1、在 /home 目录下 hello.txt 文件中,查找 “yes” 所在行,并显示行号:

1
cat /home/hello.txt | grep -n "yes"

5.6 压缩和解压类

gzipgunzip

gzip 用于压缩文件,gunzip 用于解压文件。它们的基本语法是:

1
2
gzip 文件 # 压缩文件,将指定文件压缩为 *.gz 文件
gunzip 文件.gz # 解压文件

压缩文件后,被压缩的文件将不存在;解压文件后,被解压的文件将不存在。

zipunzip

zip 用于压缩文件,unzip 用于解压文件,这两个指令在项目打包发布时很有用。其基本语法是:

1
2
zip [选项] XXX.zip 将要被压缩的内容 # 压缩文件或目录
unzip [选项] XXX.zip # 解压缩文件

zip 常用选项:

1、-r 递归压缩,即压缩目录。

unzip 常用选项:

1、-d 目录 指定压缩后文件的存放目录。

使用示例:

1、将 /home 下的所有文件压缩成 myhome.zip:

1
zip -r myhome.zip /home/

2、将 myhome.zip 解压到 /opt/tmp 目录下:

1
2
mkdir /opt/tmp # 创建目标目录
unzip -d /opt/tmp myhome.zip

tar

tar 指令是打包指令,打包后的文件后缀是 .tar.gz。其基本语法是:

1
tar [选项] XXX.tar.gz 打包的内容 # 打包目录,压缩后的文件格式是 .tar.gz

选项说明:

选项 功能
-c 产生 .tar 打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包 .tar 文件

使用示例:

1、压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz

1
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

2、将 /home 的文件夹压缩成 myhome.tar.gz

1
tar -zcvf myhome.tar.gz /home/

3、将 pc.tar.gz 解压到当前目录

1
tar -zxvf pc.tar.gz

4、将 myhome.tar.gz 解压到 /opt/tmp2 目录下

1
2
mkdir /opt/tmp2
tar -zxvf /home/myhome.tar.gz -C /opt/tmp2

6. 组管理和权限管理

6.1 组管理

组的创建与用户组的修改

组的创建我们在前文已经说过,使用指令 groupadd 组名 即可创建组。

如果需要创建一个用户并将其放到某个组中,使用指令:useradd -g 组名 用户名

在添加用户时,可以指定将该用户添加到哪个组中,使用 root 的管理权限可以改变某个用户所在的组。其基本语法是:

1
2
usermod -g 新组名 用户名
usermod -d 目录名 用户名 # 改变该用户登录的初始目录,用户需要有进入到新目录的权限

组的基本介绍

在 Linux 中的每个用户必须属于一个组,不能独立于组。在 Linux 中每个文件有所有者、所在组和其他组的概念。

所谓其他组,除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组。

当创建一个文件时,这个文件默认属于文件所有者所在的组。

如果需要修改文件所在的组,可以使用指令:chgrp 组名 文件名

文件 / 目录的所有者

文件或目录的所有值一般为文件的创建者,谁创建了文件,谁就自然地成为了该文件的所有者。

查看文件的所有者可以使用指令:ls -ahl。其实使用 ls -al 或者 ll 指令即可,h 是更人性化地显示文件大小。

修改文件的所有者可以使用指令:chown 用户名 文件名

6.2 权限的基本介绍

当我们使用 ls -l 指令时,显示的内容如下:

-rw-r--r-- 1 root  root      3 Sep 21 23:43 info.txt

我们会发现在最前面有 10 位,每位可以对应一个字母,那么它们是干嘛的,所对应的字母又是什么意思呢?

1、第 0 位用于确定文件类型,可选值有 d, -, l, c, b。其中 l 表示链接,相当于 Windows 中的快捷方式;d 表示目录,相当于 Windows 中的文件夹;c 表示字符设备文件,比如鼠标、键盘等;b 表示块设备,比如硬盘。

2、第 1 - 3 位确定文件所有者拥有该文件的权限。

3、第 4 - 6 位确定所属组(同用户组的)拥有该文件的权限,或者说与文件拥有者同一组用户拥有该文件的权限;

4、第 7 - 9 位确定不与文件拥有者同组的其他用户拥有该文件的权限。

也就说,第 1 - 9 位表示了文件权限,每一位的可选值有三个,分别是:r, w, x

其他说明

针对上述给出的 info.txt 中的信息:

可以看到还有个 1,这个 1 是什么意思呢?如果当前信息属于文件,那么这就是 1;如果当前信息属于目录,这表示目录下的文件数和子目录数之和。

第一个 root 表示文件的所有者,第二个 root 表示文件所在的组。

紧接着的 3 表示文件的大小,字节数。如果使用 ls -lh 指令,可以更人性化地显示文件的大小信息。

Sep 21 23:43 表示当前文件或目录的最后修改时间,最后的 info.txt 当然就表示文件名或目录名了。

6.3 rwx 权限详解

rwx 作用到文件

1、r 表示可读,即 read,可以读取查看;

2、w 表示可写,即 write,可以修改,但是不代表可以删除该文件。删除一个文件的前提条件是 对该文件所在的目录有写权限 才能删除该文件;

3、x 表示可执行,即 execute,可以被执行。

rwx 作用到目录

1、r 表示可读,即 read,可以读取,可以使用 ls 指令查看目录内容;

2、w 表示可写,即 write,可以修改,可以在目录内创建、删除文件,重命名目录;

3、x 表示可执行,即 execute,可以进入该目录。

我们也可以使用数字来表示响应的权限,其中 r = 4,w = 2,x = 1,因此 rwx 就是 7。

除此之外,还可以得出一个小结论: 如果需要对目录内的文件进行操作,需要对该目录有相应的权限。

目录权限拓展

假设现在有两个用户,分别为 UserA 和 UserB,他们也位于同一个用户组中。此时 UserA 创建了一个目录 List,并在目录中创建了一个名为 a.txt 的文件。UserA 移除其同组的用户对 List 目录的所有权限。

此时 UserB 不能进入 List 目录,不能在 List 目录内创建删除文件,也不能查看目录内的内容。

如果 UserA 给 List 添加同组用户读的权限,UserB 可以查看到 List 目录中的内容,但是也会产生以下信息:

ls: cannot access /List/xx: Permission denied

如果移除 List 同组用户读的权限,UserB 再次使用 ls 指令,则会显示:

ls: cannot open directory /List/: Permission denied

如果赋予 List 同组用户写的权限,但没赋予执行权限,UserB 是无法在 List 目录中创建、删除文件的。

如果赋予 List 同组用户执行的权限,但未赋予读写权限,UserB 无法执行 ls 查看 List 目录中的内容。如果 List 目录中的 a.txt 文件允许同组用户读写,即便 UserB 无法查看到 List 中的内容,但 UserB 仍可以通过 vim 指令修改 a.txt 的内容,但无法删除 a.txt。

6.4 权限修改

通过使用 chmod 指令可以修改文件或目录的权限。

使用 +、-、= 变更权限

声明:u 表示所有者、g 表示所有组、o 表示其他人、a 表示所有人,即 u、g、o 的总和。

1
2
3
chmod u=rwx,g=rx,o=x 文件/目录名
chmod o+w 文件/目录名 # 为其他用户赋予写权限
chmod a-x 文件/目录名 # 移除所有用户的执行权限

使用示例:

1、给 abc 文件的所有者移除执行权限,增加组的写权限:

1
chmod u-x,g+w abc

2、给 abc 文件的所有用户添加读写权限:

1
chmod a+r+w abc

使用数字变更权限

声明:r = 4,w = 2,x = 1。

下面两条指令的效果是一样的:

1
2
chmod u=rwx,g=rx,o=x 文件/目录名
chmod 751 文件/目录名

6.5 修改文件所有者

使用 chown 指令可以修改文件所有者。其基本语法是:

1
2
chown newowner 文件/目录 # 改变所有者
chown newowner:newgroup 文件/目录 # 改变所有者和所在组

常用选项:

1、-R 如果是目录,则使其下所有子文件或目录递归生效。

使用示例:

1、将 /home/abc.txt 文件的所有者改为 tom:

1
chown tom /home/abc.txt

2、将 /home/kkk 目录下所有文件和目录的所有者都修改为 tom:

1
chown -R /home/kkk

6.6 修改所在组

使用 chgrp 指令可以修改文件或目录的所在组。其基本语法是:

1
chgrp newgroup 文件/目录 # 改变所在组

使用示例:

1、将 /home/abc.txt 文件的所在组修改为 shaolin:

1
chgrp shaolin /home/abc.txt

2、将 /home/test 目录下所有文件和目录的所在组都修改为 shaolin:

1
chgrp -R shaolin /home/test

7. 定时任务调度

7.1 任务调度基本概念

任务调度,是指系统在某个事件执行的特定的命令或程序。

任务调度分类:

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

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

7.2 crontab 快速入门

crontab 指令

使用 crontab 指令可以进行定时任务的设置。其基本语法是:

1
crontab [选项]

常用选项有:

选项 功能
-e 编辑 crontab 定时任务
-l 查询 crontab 定时任务(查看当前有哪些任务调度)
-r 删除当前用户所有的 crontab 任务(终止任务调度)

在某些时候还需要 重启任务调度,可以执行指令 service crond restart

快速入门

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

比如将 */1 * * * * ls -l /etc/ > /tmp/to.txt 写入调度文件中,表示每小时的每分钟都将执行 ls -l /etc/ > /tmp/to.txt

占位符的说明:

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

具体操作

执行以下指令进入调度文件:

1
crontab -e # 进入调度文件

在调度文件中输入以下内容:

*/1 * * * * ls -l /etc/ > /tmp/to.txt

键入 ESC 后输入 :wq,保存并退出。

如果任务插入成功,将会显示:

crontab: installing new crontab

然后可以进入 /tmp 目录,查看其中是否含有 to.txt 文件,还可以执行指令 more /tmp/to.txt 查看其内容是否是 /etc 中的文件信息。

特殊符号的说明

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

特殊时间执行任务案例

时间 含义
45 22 * * * 在 22 点 45 分执行命令
0 17 * * 1 每周一的 17 点 0 分执行命令
0 5 1,15 * * 每月 1 号和 15 号的凌晨 5 点 0 分执行命令
40 4 * * 1-5 每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 * * * 每天的凌晨 4 点,每隔十分钟执行一次命令(到 5 点后就不再执行)
0 0 1,15 * 1 每月 1 号和 15 号,每周一的 0 点 0 分执行一次命令

注意: 星期几和几号最好不要同时使用,因为它们定义的都是天,非常容易是管理员混乱。

7.3 crond 应用实例

实例 1:每隔一分钟,就将当前的日期时间追加到 /tmp/mydate 文件中。

1
*/1 * * * * date >> /tmp/mydate

实例 2:每隔一分钟,将当前日期和日历都追加到 /home/mycal 文件中。

我们发现,这里有两个指令,我们除了直接在调度文件中添加这两条指令外,还可以编写 Shell 脚本。

执行指令 vim /home/my.sh,编写一个 Shell 脚本,其内容如下:

1
2
date >> /home/mycal
cal >> /home/mycal

然后为这个文件 增加执行权限,执行指令 chmod u+x my.sh 即可,最后再使用 ./my.sh 执行这个脚本。

接下来只需要每分钟执行这个脚本就行了,执行指令 crontab -e 打开调度文件,在调度文件中追加以下内容:

1
*/1 * * * * /home/my.sh

最后保存退出即可。

实例 3:每天凌晨 2 点将 MySQL 数据库 testdb 备份到文件中。

假设数据库用户名是 root,密码是 12345。

执行指令 crontab -e 打开调度文件,在调度文件中追加以下内容:

1
0 2 * * * mysqldump -u root -p 12345 testdb >> /home/db.bak

最后保存退出即可。

7.4 at 定时任务

基本介绍

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

2、默认情况下,atd 守护进程每 60 秒检查 作业队列。有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

3、at 命令是一次性定时任务计划,执行完一个任务后不再执行此任务了。

4、在使用 at 命令时,一定要保证 atd 进程的启动, 可以使用相关指令来查看。

使用 ps -df 指令可以查看当前系统所有进程,但是进程太多,怎么知道 atd 进程是否启动呢?可以对进程进行过滤,使用指令:

1
ps -ef | grep atd # 检查 atd 进程是否在运行

at 命令格式

1
at [选项] [时间]

Ctrl + D 结束 at 命令的输入。

at 常用选项

选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atd 的别名
-d atrm 的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q [队列] 使用指定的队列
-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(星期)。count 是时间的数量,几天,几小时。例如:now + 5 minutes

6、直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。

7.5 at 定时任务实例

实例 1:2 天后的下午 5 点执行 /bin/ls /home

1
2
at 5pm + 2 days
at> /bin/ls /home

最后需要键入 两次 Ctrl + D

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

1
atq

实例 3:明天 17 点,输出时间到指定的文件(/root/date100.log)内

1
2
at 5pm tomorrow
at> date > /root/date100.log

最后需要键入 两次 Ctrl + D

实例 4:2 分钟后,输出时间到指定的文件(/root/date200.log)内

1
2
at now + 2 minutes
at> date > /root/date100.log

最后需要键入 两次 Ctrl + D

实例 5:删除已经设置的定时任务,使用 atrm 编号

1
atrm 1 # 删除 1 号任务

在输入需要执行的命令时,输入有误,单按 backspace 退格键是无法删除的,需要 Ctrl + backspace 一起按下才行。

8. 磁盘分区与挂载

8.1 分区原理

对 Linux 来说无论有几个分区,分给哪-一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构。Linux 中每个分区都是用来组成整个文件系统的一部分。

Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,并将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。

磁盘说明

Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上都是 SCSI 硬盘。

对于 IDE 硬盘,驱动器标识符为 hdx~,其中 hd 表明分区所在设备的类型,这里指 IDE 硬盘。x 为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘)。~ 代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例如,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个IDE硬盘上的第二个主分区或扩展分区。

对于 SCSI 硬盘则标识为sdx~, SCSI 硬盘是用 sd 来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样。

查看所有设备挂载情况

可以使用指令 lsblk (老色比,look 😂)或 lsblk -f 进行查看。比如我的阿里云 ECS 中所有可用块设备的信息:

阿里云ECS中所有可用块设备的信息

其中的 vda1 表示为第一个 Virtio 磁盘上的第一个主分区或拓展分区。

8.2 挂载的经典案例

注意: 由于我使用阿里 ECS 学习 Linux,无法添加硬盘, 以下笔记根据视频内容编写。

我们将以一块硬盘为例来熟悉磁盘的相关指令和深入理解磁盘分区、挂载和卸载的概念。

那如何增加一块硬盘呢?

1、虚拟机添加硬盘

在【虚拟机】菜单中,选择【设置】,然后设备列表里添加硬盘,然后一路【下一步】,中间只有选择磁盘大小的地方需要修改,至到完成,最后需要重启系统才能识别。

假设我们已有一个 IDE 硬盘,名为 hda,那在添加一块硬盘后,添加的硬盘名为 hdb。

添加好硬盘后,我们能发现这块硬盘并没有分区。

2、分区

如果需要分区,则执行以下指令:

1
fdisk /dev/sdb # 对 sdb 进行分区

输入上述指令后,还需要输入命令,相关命令如下:

m 可显示命令列表;p 可显示磁盘分区,同 fdisk -ln 可新增分区;d 可删除分区;w 表示写入并退出。

步骤: 输入 fdisk /dev/sdb 指令后,开始分区后输入 n 以新增分区,然后会让你输入分区号(可选值 1-4),按需输入即可,我在此输入 1,然后两次回车使用默认配置。最后记得输入 w 写入分区并退出,若不保存直接退出则输入 p

完成上述步骤后,执行 lsblk -f 指令后,可看到 sdb 硬盘下有个名为 sdb1 的分区,但是这个分区没有 UUID 和 MOUNTPOINT。

这时需要对其进行格式化。

3、格式化

如果需要格式化,则执行以下命令:

1
mkfs -t ext4 /dev/sdb1 # 启动 ext4 是分区类型

如果再执行 lsblk -f 指令,可以看到 sdb1 分区的 UUID 已经有值了,但挂载点依旧没值。

4、挂载

所谓挂载就是将一个分区与一个目录联系起来,其基本语法是:

1
mount /dev/sdb1 /newdisk # mount 设备名称 挂载目录

如果需要卸载,则可以执行:

1
2
3
umount /dev/sdb1 
#
umount /newdisk

“两个人在一起要彼此相爱,但关系的破裂仅需一方。”

注意:

1、一个目录只能挂载一个分区;

2、 用命令行进行挂载在 重启后会失效;

为了解决重启挂载失效的问题,我们需要设置自动挂载(永久挂载)。

5、设置可以自动挂载(自动挂载)

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

 /dev/sdb1			/newdisk			ext4		defaults		0 0
 

8.3 磁盘情况查询

查询系统整体磁盘使用情况的基本语法是:

1
df -h

如果想查询指定目录的磁盘占用情况,其基本语法是:

1
du -h /目录

默认为当前目录。

du 指令常用的选项:

选项 含义
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
–max-depth=1 子目录深度,这里子目录深度为 1
-c 列出明细的同时增加汇总值

比如,查询 /opt 目录的磁盘占用情况,深度为 2:

1
du -hac --max-depth=2 /opt

8.4 工作实用指令

1、统计 /opt 目录下文件的个数:

1
ls -l /opt | grep "^-" | wc -l

2、统计 /opt 目录下目录的个数:

1
ls -l /opt | grep "^d" | wc -l

3、统计 /opt 目录下文件的个数,包括子文件夹里的:

1
ls -lR /opt | grep "^-" | wc -l

4、统计 /opt 目录下目录的个数,包括子文件夹里的:

1
ls -lR /opt | grep "^d" | wc -l

5、以树状显示目录结构:

1
tree /opt

执行 tree /opt 指令时显示以下信息:

-bash: tree: command not found

这是因为在默认情况下并没有安装这个指令。我们 在联网环境下 可以安装这个指令:

1
yum install tree 

安装完成后再执行 tree /opt 即可。

9. 网络配置

9.1 NAT 网络原理图

如果需要查看 Linux 的网络配置信息,可以使用以下指令:

1
ifconfig

显示信息中 inet 后紧跟着的就是 IP 信息。

如果需要在 Windows 中查看网络配置信息,需要在 CMD 中执行 ipconfig 即可。

NAT网络配置图

除了前面所说的 ipconfigifconfig 指令外,我们可以使用 ping 指令来测试主机之间的网络连通性,其基本语法是:

1
ping 目的主机 # 测试当前服务器是否可以连接目的主机

比如:

1
ping www.baidu.com

9.2 Linux 网络环境配置

方式一:自动获取

在虚拟机环境下可在登录后,通过界面来设置自动获取 IP。

其特点是 Linux 启动后会自动获取 IP,但是每次自动获取的 IP 地址可能是不一样的,这样就没办法作为服务器。

方式二:指定 IP

直接修改配置文件来指定 IP,并可以连接到外网。

在虚拟机环境下,编辑 ifcfg-ens33 文件,输入指令:

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

要求将 IP 地址配置为静态的,比如:192.168.200.130。

ifcfg-ens33 文件说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
DEVICE=etho # 接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx # MAC 地址
TYPE=Ethernt # 网络类型(通常是 Ethernt)
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 # 随机 ID
ONBOOT=yes # 系统启动时网络接口是否有效,可选 yes/no
# IP 的配置方法[none|static|bootp|dhcp](引导时使用协议|静态分配IP|BOOTP协议|DHCP协议)
BOOTPROTO=static
# IP 地址
IPADDR=192.168.200.130
# 网关
GATEWAY=192.168.200.2
# 域名解析器
DNS1=192.168.200.2

文件修改完成后,需要在“虚拟机网络编辑器”中对虚拟机的网关进行修改,改成 192.168.200.2;对子网 IP 进行修改,改成同一网段,如:192.168.200.xx

最后需要重启网络服务或重启系统生效,执行以下指令:

1
2
3
service network restart
# 或者
reboot

9.3 主机名与hosts映射

设置主机名

为了方便记忆,可以给 Linux 系统 设置主机名,也可以根据需要修改主机名。 其指令是:

1
hostname # 查看主机名

如果需要修改,则需要在 /etc/hostname 文件中指定,修改后需要进行重启。

设置 host 映射

设置主机名后,如何通过主机名 ping 通某个 Linux 系统呢?

如果在 Windows 环境下 ping Linux,需要修改 hosts 文件,这个文件的路径如下:

C:/Windows/System32/drivers/etc/hosts

比如我们 Linux 的 IP 地址是 192.168.200.130,主机名为 mofan,那么需要在 hosts 文件中添加:

1
192.168.200.130 mofan

然后在 Windows 环境下执行 ping mofan 指令即可。

如果在 Linux 环境下 ping Windows,那么需要在 /etc/hosts 文件下指定。

比如我们 Windows 的 IP 地址是 192.168.200.1(如果是虚拟机,此 IP 为 Windows 中 vmnet8 的 IPV4 地址),那么可以在 hosts 文件下添加:

1
192.168.200.1 yang

然后在 Linux 环境下执行 ping yang 指令即可。

主机名解析过程分析(hosts 与 DNS)

hosts 是什么?

它是一个文本文件,用来记录 IP 和 hostname(主机名)的映射关系。

DNS 是什么?

DNS,Domain Name System 的缩写,即:域名系统。它是互联网上作为域名和 IP 地址相互映射的一个分布式数据库。

以用户在浏览器中输入 www.baidu.com 为例:

1、浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,如果有就先调用这个 IP 完成解析;如果没有则检查操作系统DNS解析器缓存,如果有直接返回 IP 完成解析。这两个缓存,可以理解为本地解析器缓存。

2、一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存它的 IP 地址(DNS 解析记录)。在 Windows 环境下的 CMD 窗口中输入以下指令可查看或清理 DNS 缓存:

1
2
ipconfig /displaydns # DNS 域名解析缓存
ipconfig /flushdns # 手动清理 DNS 缓存

3、如果本地解析器缓存没有找到对应映射,检查系统中 hosts 文件中有没有配置对应的域名 IP 映射,如果有,则完成解析并返回。

4、如果本地 DNS 解析器缓存和 hosts 文件中均没有找到对应的 IP,则需要到域名服务 DNS 进行解析域。

主机名解析过程

10. 进程管理

10.1 进程基本介绍

在 Linux 中,每个 执行的程序 都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。

每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户在当前的屏幕上可以进行操作的。后台进程则是实际在操作但在屏幕上无法直接看到,通常使用后台方式执行。

一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才才结束。

10.2 ps 指令

ps 指令可以用来查看目前系统中有哪些进程正在执行以及它们的执行情况。使用时可以不加任何参数。

ps 指令显示的信息选项:

字段 说明
USER 用户名称。执行进程的用户。
PID 进程识别号
%CPU 进程所占 CPU 的百分比
%MEM 占用物理内存的百分比
VSZ 占用虚拟内存的大小,单位 KB
RSS 占用物理内存的大小,单位 KB
TTY 终端机号
STAT 进程状态。S 休眠,s 该进程是会话的先导进程,N 该进程拥有比普通优先级更低的优先级,R 正在运行,D 短期等待,Z 僵尸进程(僵尸进程应该被定时清理),T 被跟踪或被停止
START 启动时间
TIME 使用的 CPU 的总时间
CAMMAND 启动进程所用的命令或参数,太长会被截断显示

ps 常用的选项:

选项 含义
-a 显示当前终端的所有进程信息
-u 以用户的格式显示进程信息
-x 显示后台进程运行的参数
-e 显示所有进程
-f 全格式显示

一般来说我们会同时使用前三个选项,即:ps -aux。由于列出的信息过多,我们可以使用管道符并进行翻页阅读,即:

1
ps -aux | more

如果想要关注某个进程的执行情况,可以使用以下指令查看 xx 服务的执行情况:

1
ps -aux | grep xx

10.3 父子进程

应用实例:以全格式显示当前所有的进程,查看进程的 父进程

使用以下指令可以以全格式显示当前所有的进程:

1
ps -ef

如果我们想查看 sshd 进程的父进程,可以使用:

1
ps -ef | grep sshd

可以看到其父进程的 PID 为 1。

使用 ps -ef | more 指令显示的信息选项:

字段 说明
UID 用户 ID
PID 进程 ID
PPID 父进程 ID
C CPU 用于计算执行优先级的因子。数值越大,说明该进程是 CPU 密集型运算,执行优先级会降低;数值越小,说明该进程是 IO 密集型运算,执行优先级会提高
STIME 进程的启动时间
TTY 完整的终端名称
TIME 使用的 CPU 的总时间
CMD 启动进程所用的命令和参数

10.4 终止进程

若是某个进程执行一半需要停止时,或是已经消耗了很大的系统资源时,此时可以考虑停止该进程。可以使用 kill 指令来终止进程。

终止进程的基本语法:

1
2
kill [选项] 进程号 # 通过进程号杀死进程 
killall 进程名称 # 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用

kill 常用的选项:

选项 含义
-9 强迫进程立即停止

最佳实践

案例 1:踢掉某个非法登录用户

1
kill 登录用户的进程号 # 比如:kill 11421

登录用户的进程号可用 ps -ef | grep sshd 指令查看。

案例 2:终止远程登录服务sshd,在适当时候再次重启 sshd 服务

1
2
3
ps -ef | grep sshd # 查看 sshd 服务的进程号
kill sshd服务的进程号
/bin/systemctl start sshd.service # 重启 sshd 服务

案例 3:终止多个 gedit

1
killall gedit # 终止 gedit 相关的所有进程,包括子进程

案例 4:强制杀掉一个终端

1
2
ps -ef | grep bash # 查看终端的进程
kill -9 终端进程号

10.5 查看进程树

查看进程树的基本语法是:

1
pstree [选项] # 更直观的查看进程信息

pstree 常用的选项:

选项 含义
-p 显示进程的 PID
-u 显示进程的所属用户

应用案例

案例 1:以树状的形式显示进程的 PID

1
pstree -p

案例 2:以树状的形式显示进程所属用户的 ID

1
pstree -u

10.6 服务管理

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

连接Linux服务原理图

service 管理指令:

1
service 服务名 [start|stop|restart|reload|status]

在 CentOS 7.0 后很多服务不再使用 service ,而是 systemctl 指令。service 指令管理的服务可在 /etc/init.d 查看。

查看init.d文件

service 管理指令案例

使用 service 指令、查看、关闭、启动 network。注意: 应当在虚拟系统演示,因为网络连接后关闭 shell 服务也会关闭。

1
2
3
service network status # 查看 network 的状态
service network stop # 关闭 network 服务
service network start # 启动 network 服务

查看 service 管理的服务

方式一:在 /etc/init.d 下可看到 service 指令管理的服务,执行以下指令即可:

1
ls -l /etc/init.d

方式二:使用 setup 指令后,到系统服务即可查看到 全部

使用 setup 指令后出现 setup: command not found 的提示,我们需要安装 setup 图形界面工具。依次执行以下指令:

1、安装setuptool

1
yum -y install setuptool

2、系统服务管理

1
yum -y install ntsysv

3、安装防火墙配置

1
yum -y install iptables

4、安装网络服务

1
yum -y install system-config-network-tui

5、安装安全服务

1
yum -y install system-config-securitylevel-tui

5、安装时区以免安装的软件显示时间不对【也可不安装】

1
yum -y install system-config-date

上述安装完毕后,再执行 setup 指令即可。

服务的运行级别(runlevel)

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

运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆

运行级别 2:多用户状态(没有NFS),不支持网络

运行级别 3: 完全的多用户状态(有NFS),有网络服务,无界面,登陆后进入控制台命令行模式

运行级别 4:系统未使用,保留

运行级别 5: X11 控制台,登陆后进入图形 GUI 模式

运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动

Linux开机的流程说明

运行级别的指令可查看【5.1 指令运行级别】。

chkconfig 指令

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

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

注意: CentOS 7.0 后,很多服务使用 systemctl 管理。

chkconfig 的基本语法:

1、查看 chkconfig 管理的服务:

1
chkconfig --list | grep xxx

2、查看 chkconfig 管理的某个服务信息:

1
chkconfig 服务名 --list # 如 chkconfig network --list

3、为某个服务在某个运行级别设置自启动或关闭自启动:

1
chkconfig --level 5 服务名 on/off

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

systemctl 指令

使用 systemctl 指令可开启、关闭、重启或查看某服务,其基本语法是:

1
systemctl [start|stop|restart|status] 服务名

systemctl 指令管理的服务可在 /usr/lib/systemd/system 中查看。

systemctl 还可以设置服务的自启动状态:

1
2
3
4
systemctl list-unit-files | grep 服务名 # 查看某服务开机启动状态,如果不使用管道符可查看所有服务的状态
systemctl enable 服务名 # 设置某服务开机启动
systemctl disable 服务名 # 关闭某服务开机启动
systemctl is-enabled 服务名 # 查询某个服务是否是自启动的

使用 chkconfig 指令可以设置某个服务在某个运行级别下是否自启动,那为什么 systemctl 只指定了服务并没有指定运行级别呢?

在 CentOS 7.0 后运行级别被简化,被简化主要为运行级别 3 和运行级别 5,而使用 systemctl 指令就是设置服务在这两个级别下是否自启动。

应用案例:查看当前防火墙的状态,并关闭防火墙和重启防火墙。

1
2
3
systemctl list-unit-files | grep firewalld # 查看防火墙的状态
systemctl stop firewalld # 关闭防火墙,重启后复原。
systemctl start firewalld # 开启防火墙,重启后复原。

防火墙服务名称是 firewalld.service,指定服务名称时可以写全称,也可只写名称。

使用上述指令关闭或者启用防火墙后会立即生效。可以在 Windows 环境下使用以下指令对某个端口进行连接:

1
telnet IP地址 端口

使用 stopstart 关闭或开启防火墙只是临时生效的,当重启系统后,又会回归以前对服务的设置。

如果希望设置某个服务永久自启动或关闭,要使用以下指令:

1
systemctl [enable|disable] 服务名

firewall 指令

在真正的生产环境,往往需要将防火墙打开,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口,比如 80、22、8080 等,这个又该怎么做呢?

使用 firewall 指令可打开或关闭端口:

1
2
3
4
firewall-cmd --permanent --add-port=端口号/协议 # 打开端口
firewall-cmd --permanent --remove-port=端口号/协议 # 关闭端口
firewall-cmd --reload # 关闭或打开端口后,需要重新载入,才能生效
firewall-cmd --query-port=端口/协议 # 查询端口是否开放

查看端口号和协议信息,可以使用以下指令:

1
netstat -nap | more

10.7 动态监控进程

topps 指令很相似,它们都用来显示正在执行的进程。topps 最大的不同之处,top 可以动态更新正在运行的进程信息。

其基本语法是:

1
top [选项]

top 常用的选项:

选项 含义
-d [秒数] 指定 top 指令每隔几秒更新,默认是 3 秒
-i 使 top 不显示任何闲置或僵尸进程
-p 通过指定监控进程 ID 来仅仅监控某个进程的状态

在执行 top 指令后,可以再键入以下字符对当前的进程情况进行排序:

操作 功能
P CPU 使用率 排序,默认就是此项
M 内存的使用率 排序
N 以 PID 排序
q 退出 top

应用实例

案例 1:监视特定用户

先执行 top 指令,再输入 u 并回车,最后输入用户名即可。

案例 2:终止指定的进程

先执行 top 指令,再输入 k 并回车,最后输入需要终止的进程 ID 号即可。

案例 3:指定系统状态更新的时间,每隔 10 秒自动更新

1
top -d 10

10.8 监控网络状态

netstat 指令

使用该指令可以查看系统网络情况,其基本语法是:

1
netstat [选项]

netstat 常用的选项:

选项 含义
-an 按一定顺序排列输出
-p 显示哪个进程在调用

netstat 指令显示的常用信息选项:

字段 说明
Proto 协议
Local Address 本地地址
Foreign Address 外部地址
State 状态。LISTEN 表示监听,ESTABLISHED 表示已建立连接,TIME_WAIT 表示超时等待

应用案例:查看 sshd 的服务信息。

1
netstart -anp | grep sshd

ping 指令

ping 指令是一种网络检测工具,它主要用于检测远程主机是否正常,或是两部主机间的网线或网卡是否故障。其基本语法是:

1
ping 对方IP地址