# 一、常见命令

### 1.查看以及切换目录

#### pwd命令

作用：查看当前的工作目录

```
pwd
```

#### ls命令

作用：显示当前目录下的内容

```
ls
```

- `-h`选项：以人类可读的形式展示，需要配合`-l`选项使用

- `-l`选项：以列表的形式列出内容

- `-a`选项：展示所有内容，包括隐藏的内容
  
  > linux中隐藏文件以.开头，普通使用ls看不到，只有使用-a选项才能看到

#### cd命令

作用：切换目录

```
cd 目标目录
```

绝对路径：以根目录`/`为起点，比如`/var/spool`,指的是根目录`/`下的子目录var中的spool目录

例子：移动到/var/spool目录下

```
cd /var/spool
```

- 相对路径：以当前工作目录为起点，在开头不使用`/`，会更便捷

- 移动到上一级目录
  
  ```
  cd ../
  ```

- 当前目录用`./`表示
  
  ```
  ls ./
  ```

- 特殊变量
  
  - `~`表示当前用户家目录
  
  - `-`表示进行cd操作之前的目录

### 2.创建目录以及文件

##### mkdir命令

作用：创建新的目录

```
mkdir 目录名
```

- `-p`参数：可以级联创建目录

##### touch命令

作用：创建一个空文件

```
touch 文件名
```

### 3.复制、删除、移动目录和文件

##### cp 命令

作用：复制文件或目录

```
cp 源 目的
```

- `-r`是用来复制目录，可以级联复制目录（目录和子目录中的文件全部按结构复制）

##### mv命令

作用：移动一个文件或目录

```
mv 源 目的
```

- mv命令可以用来更改文件或者目录的名称

#### rm命令

作用：删除文件或者目录

```
rm 目标
```

- 不加任何选项删除文件，需要手动输入y，来确认删除

- `-f`选项可以强制删除，不会有询问

- `-r`选项级联删除目录，删除目录是必须写这个选项
  
  ```
  rm -rf 目标1 目标2 ....
  ```

### 4、linux关机和重启

#### 1.关机

```
shutdown
```

作用：60秒后关机

选项

- -h 加数字代表分钟，数字
  
  ```
  shutdown -h 1
  ```

- -r : 关机后重新开机。

- -t seconds : 设定在几秒钟之后进行关机程序。

#### 2.重启

```
reboot
```

# 二、文件管理

#### 1.cat

作用：查看文件的内容。

用法：

```
cat 选项 文件
```

选项：

- `-b`显示行号，不包括空行
- `-n`显示行号，包括空行

> 回车就算是空行

#### 2.more

作用：进入一个交互式界面查看文件内容

用法:

```
more 选项 文件
```

| 回车键   | 向下移动一行。        |
| ----- | -------------- |
| d     | 向下移动半页。        |
| 空格键   | 向下移动一页。        |
| b     | 向上移动一页。        |
| / 字符串 | 搜索指定的字符串。      |
| :f    | 显示当前文件的文件名和行号。 |
| q 或 Q | 退出   more。     |

#### 3.less

作用：分页查看文件内容，进入交互式界面

用法：

```
less 选项 文件
```

| 回车键   | 向下移动一行。        |
| ----- | -------------- |
| d     | 向下移动半页。        |
| 空格键   | 向下移动一页。        |
| b     | 向上移动一页。        |
| / 字符串 | 搜索指定的字符串。      |
| :f    | 显示当前文件的文件名和行号。 |
| q 或 Q | 退出   less      |

### 4.head

作用：查看文件的开头部分，默认查看文件前10行

用法：

```
head 选项 文件
```

选项：

- `-n` 指定查看的行数

### 5.tail

作用：查看文件尾部的内容，默认显示末尾10行

用法：

```
tail 选项 文件
```

选项：

- `-n` 指定查看的行数
- `-f`动态显示文件内容，**监控文件内容是否有新增**

### 6.wc

作用：显示文件的行、单词与字节统计信息

用法：

```
wc 选项 文件
```

选项：

- `-l`显示行数
- `-c` 显示字节数
- `-w` 显示单词数

### 7.du

> 问题：为什么du显示的使用空间，和ls -lh 显示的文件大小不一样

作用：查看文件使用的空间

用法：

```
du 选项 文件
```

选项：

- `-h`以人类可读的格式显示，单位为k、m、g为单位，如果不写，默认单位为k

- `-s`显示总容量，针对于目录，不加-s会列出目录中每一项的大小，加上-s会直接列出目录中项目的合计大小

例子：

```
du /etc/passwd
```

### 8.df

作用：显示磁盘分区上的可使用空间，默认单位为kb

用法：

```
df 选项
```

选项：

- `-h`以人类可读的形式输出

例子：

```
df -h
```

### 9.echo

作用：打印输入的参数

用法：

```
echo 文本
```

- 将输入内容写入到文件中，配合`\>`输出重定向符号使用

- 将内容追加到文件中，配合`\>\>`追加重定向使用

### 10.重定向

大多数系统命令从终端获取输入并将结果输出发送回终端。通常用于标准输出的命令的输出可以很容易地转移到文件中。此功能称为**输出重定向**。

当我们执行命令时，命令的输出会显示在终端上。但有时，我们需要命令的输出保存在文件中，这时就需要`>`和`>>`对命令输出进行重定向。

#### 1.输出重定向

- `>`符号，是将命令的输出存入文件，并**覆盖**文件原本的内容。
- **所有能输出结果到屏幕上的命令，都可以使用输出重定向**

```
wc -l /etc/passwd > 1.txt
```

#### 2.追加重定向

- `>>`将命令的输出，追加到目标文件中，**不会覆盖**文件内容
- **所有能输出结果到屏幕上的命令，都可以使用追加重定向**

```
df -h >> 1.txt
```

### 11.tree

windows和linux中都存在的一个命令

作用：将文件以树的形式列出来

```
yum -y install tree
```

### 12.grep

作用：在文件中查找包含目标关键词的行，并输出

用法：

```
grep 目标关键词 目标文件
```

选项：

- `-n` 显示行号（筛选出的行，在目标文件中的行号）

- `-i` 忽略大小写

- `-v` 输出没有匹配到的行

- `-r`可以在目录递归匹配所有文件的内容
  
  ```
  grep -i  -r -n ftp ./
  ```

# 三、管道

### 管道符

管道符：`|`

作用：管道是一种通信机制，通常用于进程间的通信。它表现出来的形式**将前面每一个进程的输出（stdout）直接作为下一个进程的输入（stdin）。**

**简单的说：就是把|左边命令的输出，作为|右边命令的输入**

例子：

```
cat 2.txt | grep -i ftp
```

管道符可以嵌套

- 筛选文件名中带txt的文件

# 四、打包和压缩

- 打包：把多个文件或目录集合成一个文件，集合成的文件的大小是多个文件总和。
- 压缩：把多个文件或目录集合成一个文件，但是该文件所占磁盘空间的大小，比所有文件的总和要更小。

### 1.tar打包

命令：tar

作用：将多个文件打包成一个文件

用法：

```
tar [选项] [打包后的文件名] [要打包的文件或目录]
```

> 选项可以不加上`-`

选项：

#### 打包

- `-c` 创建(create)打包文件

- `-v` 显示打包过程

- `-f` 指定打包的文件名 , **此选项必须要加(打包解包都要加)**

#### 解包

- `-x` 解包
- `-t` 查看tar文件中包含哪些文件

#### 常用命令

- 打包常用命令
  
  ```
  tar -cvf 123.tar 1.txt 2.txt 3.txt
  ```

- 解包常用命令
  
  ```
  tar -xvf 123.tar
  ```

### 2.打包并压缩

命令：tar

选项：

- `-z` 压缩成gzip格式
- `-j` 压缩成bz2格式
- `-J` 压缩成xz格式

#### 常用命令

- 打包并压缩

```
tar -zcvf 123.tar.gz  1.txt 2.txt 3.txt 
```

- 解压并解包

```
tar -zxvf 123.tar.gz
```

### 3.zip压缩和解压

- 安装zip

```
yum -y install zip
```

作用：创建一个zip格式的压缩包

用法：

```
zip 压缩后的文件名 目标1 目标2 目标3 ....
```

#### 压缩

```
zip 123.zip 1.txt 2.txt 3.txt
```

#### 解压

```
unzip 123.zip
```

选项： `-d` 指定要解压到哪个目录

# 五、Vim编辑器

vim是一个linux系统下的文本编辑器，类似于windows环境下的 notepad（记事本）。vim是vi编辑器的加强版，比vi更加易于使用。

### vim有三种工作模式

- 普通模式（一般模式）
- 插入模式（编辑模式）
- 命令模式

安装

```
yum -y install vim
```

> 整体操作流程文字描述：
> 
> - vim 文件名--------打开文件
> - 按 i 进入编辑模式，编辑文件
> - 按esc退出编辑模式
> - 按`shfit+：`，进入命令模式
> - 输入wq，回车，保存并退出

### 1.vim打开文件

命令：vim

用法：

> 打开不存在的文件，保存时会新建

```
vim 文件名
```

### 2.vim编辑模式操作

**进入vim界面后，按 i 键**，即可进入编辑模式，可以插入或删除文本，**按`ESC`，可以退出编辑模式**

### 3.vim普通模式操作

打开文件后，默认的模式就是普通模式，**编辑模式按下按`ESC`，同样进入普通模式**

```
/abc              搜索“abc”内容
gg              光标立马回到第一行
G               移动到最后一行
dd              删除一行
ndd                删除n行
d2j             删除当前行和下两行
yy              复制一行
y2y             复制2行
p (小写)         粘贴到光标之后
P (大写)         粘贴到光标之前
u                撤销上一步操作，可以多次使用uu表示撤销两步操作
```

### 4.命令模式操作

普通模式下 按下英文的`:`，进入命令模式，特征是左下角有一个`:`

#### vim保存文件（重点）

- **q ：退出**
- **q!：强制退出**
- **wq：保存并退出**

# 六、用户管理

1.查看用户和组

#### 1.1 查看/etc/passwd文件

- 可以查看用户基本信息

```
cat /etc/passwd
```

#### 1.2 查看/etc/group文件

- 可以查看用户组的信息

```
cat /etc/group
```

#### 1.3 id命令

- 作用：查看一个用户的基本信息，包含用户id、用户组id、附加组id.....、该指令如果不指定用户，则默认查看当前用户的信息

```
id
id root
```

### 2.创建用户和组

#### 2.1 创建用户

- 命令：useradd

- 作用：添加用户

- 语法
  
  ```
  useradd 选项 用户名
  ```
  
  ```
  useradd test5
  ```
  
  > 查看/etc/passwd，test5用户成功添加

- 选项
  
  - -c 设置账号描述信息，一般为账号全称。
  
  - -d 设置账号家目录，**默认为/home/用户名**
  
  - -e 设置账户的失效日期，格式为YYYY-MM-DD.
  
  - -g 设置账户的基本组。选项值可以是用户组ID，也可以是组名
  
  - -G 设置账户的附加组，多个附加组中间用逗号隔开。选项值可以是用户组ID，也可以是组名
  
  - -M 不创建账户家目录，一般与-s结合使用。
  
  - -s **指定用户登入后所使用的shell 解释器，默认/bin/bash【专门的接待员】，如果不想让其登录，则可以设置为/sbin/nologin。**
    
    > 设置了/sbin/nologin之后，无法使用该账户登录ssh
  
  - -u 指定账户 UID。UID，用户的id（用户的标识符），**系统默认会从500 /或1000之后按顺序分配uid**，如果不想使用系统分配的，可以通过该选项自定义
    
    > UID是唯一的

#### 2.2 创建组

- 命令：groupadd

- 作用：添加一个组

- 语法：
  
  ```
  groupadd 选项 组名
  ```

- 选项
  
  - -g 设置用户组的gid，如果不指定，则默认从1000之后递增

```
groupadd -g 1600 TestGroup
```

> 使用groupadd创建TestGroup组，查看/etc/group 发现已经新增

### 3.修改用户和组

#### 3.1 passwd命令

- 作用 ： 修改用户的密码

- 语法
  
  ```
  passwd 用户名
  ```
  
  > 不指定用户名的话，默认修改当前用户的密码

- **/etc/shadow文件**

​ 由于 /etc/passwd文件允许所有用户读取，易导致用户密码泄露，因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来，并单独放到了shadow文件中。

​ /etc/shadow 文件只有 root 用户拥有读权限，其他用户没有任何权限，这样就保证了用户密码的安全性。

用户设置密码之后，会自动在/etc/shadow文件中进行体现**/etc/shadow文件**

#### 3.2 usermod

作用：修改用户的信息

用法：

```
usermod 选项 用户名
```

选项：

- -d 修改账户家目录
- -e 修改账户失效日期
- -g 修改账户所属基本组
- -G 修改账户所属附加组
- -s 修改账户登录Shell
- -u 修改账户 UID
- **-L：锁定用户，锁定后用户无法登陆系统lock**
- **-U：解锁用户unlock**

> 修改用户时，可以直接设置是否锁定该用户

##### 锁定用户账户的影响：

1. **禁止用户登录**：用户无法使用密码通过常规的身份验证方法登录系统。
2. **不影响文件访问**：用户锁定后仍然能够访问他们的文件，只是不能登录系统。
3. **SSH 等服务仍然受影响**：通过 SSH 或其他服务登录时，也会被拒绝。

#### 3.3 groupmod

作用：修改用户组的信息

语法：

```
groupmod 选项 组名
```

选项：

- -g ：gid缩写，设置一个自定义的用户组ID 数字

- -n ：name缩写，设置新的用户组的名称

```
groupmod -g 1700 -n Group3 TestGroup
```

> 查看/etc/group，发现TestGroup的gid和名字已经成功更改

### 4.删除用户和组

#### 4.1 userdel

- 作用：删除用户

- 语法
  
  ```
  userdel 选项 用户名
  ```

- 选项
  
  - -r 删除用户的同时，删除其对应的家目录

例子：

- 不加-r选项删除用户
  
  ```
  userdel test
  ```

- 加 -r 选项
  
  ```
  userdel -r test1
  ```

#### 4.2 groupdel

作用：删除用户组

语法：

```
groupdel 组名
```

```
groupdel Group3
```

> 查看/etc/group文件，发现Group3已经删除

## 5、su和sudo

### 1.su 命令

作用：切换用户

语法：

```
su [-] 用户
```

- 切换用户时，**要输入目标用户的密码**

- 切换到root用户时，可以使用`su -`

```
su -
```

- 切换用户之后前后的工作路径是不变的，**添加了选项[-]会自动切换到用户的家**；

### 2.sudo

作用：允许授权用户以超级用户的权限执行命令，而无需切换到root用户。

- 使用sudo权限时，**要输入当前用户的密码**

# 七、权限管理

#### 1.查看文件权限

命令： ls -l

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-13-39-image.png)

#### 2.文件权限详解

Linux 中存在三类身份：

- 属主(u拥有者)

- 属组(g用户组)

- 其他用户（o）
  
  ls -l的结果详解：

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-14-02-image.png)

#### 3.chomd设置文件/目录的权限

命令：chmod

语法：

```
chmod [选项] 权限模式 目标文件
```

作用：添加或者删除目标文件/目录的ugo权限

选项：

- -R 递归将权限应用到所有的子目录和子文件

**注意：如果要给文件设置权限，操作者要么是root用户，要么是文件的所有者**

##### 3.1 用字母形式设置

> 用前面提到的u、g、o的方法设置

> 不加u、g、o的话，默认对所有权限组进行设置，只能设置单个权限

- 用法一：chmod 要增加权限的所有者+要增加的权限 文件名

```bash
chmod  u+x 1.txt
含义：1.txt文件，给属主增加执行权限
```

> 使用chmod u+x 之后，1.txt文件权限的属主一栏，加上了x权限，也就是可执行权限

- 用法二：chmod 多个要增加的权限 文件名

> 相当于可以同时对不同的权限分类设置权限，下面的例子就是对**属组和其他**同时设置权限

```bash
示例代码：
chmod  g+x,o+x 1.txt
注意：同时改变多个对象的权限，中间使用“逗号“分割。
```

- 用法三：chmod 要减少的权限 文件名

```
chmod u-r 1.txt
减少对应权限组的权限
```

- 用法四：chmod 要赋予的权限 文件名---------批量给权限
  
  ```
  示例代码：
  chmod u=rwx,g=rwx,o=rwx 1.txt
  含义：对于1.txt文件，给属主，属组，其他，都 赋予 读，写，执行权限
  ```
  
  > 要达到上述效果，也可以使用 chmod a+rwx 1.txt

- 用法五：chmod -R 要赋予的权限 目录

> ls -ld 123 -d选项，只查看目录本身的权限，不查看目录中的内容

```
chmod -R a=rwx 123
```

注：

1）如果同时设置多个身份的权限时候，每个身份之间需要通过英文逗号分开。

例如：

```powershell
chmod -R u=rwx,g=rwx,o=rwx 1.txt
```

2）在权限设置中，如果有两部分权限一样则可以合在一起写

```powershell
例如：
chmod u=rwx,g=rwx
等价于：
chmod ug=rwx
```

##### 3.2 用数字形式设置

> 想要给什么权限，就把对应权限的数字加起来

经常会在技术网站上看到类似于chmod 777 a.txt 这样的命令，这种形式称之为**数字形式权限**。

**文件权限对应关系(重点)**

| 权限  | 对应数字 | 意义   |
| --- | ---- | ---- |
| r   | 4    | 可读   |
| w   | 2    | 可写   |
| x   | 1    | 可执行  |
| -   |      | 无此权限 |

**权限与数字对应详解**

**技巧：不要背上面的表格，只要记住R，W，X对应4,2,1，之后做10以内加法**

```powershell
用法六：chmod 要赋予的权限（数字形式） 文件名
示例代码：
chmod 765 quanxian.txt
含义：对于quanxian.txt文件，给属主所有权限，属组读写权限，其他读和执行权限
注意：
全部权限：7 = r+w+x = 4 + 2 + 1
读写权限：6 = r+w = 4 + 2
读和执行：5 = r+x = 4 + 1
综上所述，u=7，g=6，o=5
```

例子：

- 我们要对1.txt这个文件设置权限
  
  - 所有者要设置**读和执行**权限 5
  
  - 所属组要设置**读和写**权限 6
  
  - 其他用户要设置**执行**权限 1

```
chmod 561 1.txt
```

- 解读设置的权限
  
  ```
  chmod 655 1.txt
  ```
  
  - 所有者是读写权限
  - 所属组读和执行权限
  - 其他用户读和执行权限

## 4、属主与属组设置

属主：所属的用户，文件所有者，这是一个账户，这是一个人

属组：所属的用户组，这是一个组

基本语法：`ls -l`查看文档属主与属组

#### 1.chown修改文件的属主

基本语法：

```
chown [-R] 文件新的所有者 目录
```

作用：更改文件/目录的所有者 （change owner）

选项：-R 递归修改所有者

例子：

- 修改1.txt的所有者为test2

```
chown test2 1.txt
```

- 递归修改123目录下的所有文件和子目录的所有者

```
chown -R test2 1.txt
```

### 2.chgrp修改文件的属组

基本语法：

```
chgrp [-R] 文件新的所有者 目录
```

作用：更改文件的所属组（change group）

选项：-R 递归修改所有者

例子：

- 修改1.txt的所属组为test2

```
chgrp test2 1.txt
```

- 递归修改123目录下的所有文件和子目录的所属组

```
chgrp -R test2 123
```

### 3.chown同时修改属主与属组(重点)

用法：

```
chown [-R] 属主名:属组名 目标
```

例子：

- 修改 1.txt 文件的属主和属组都为root

```
chown root:root 1.txt
```

- 递归修改目录中的属主和属组

```
chown -R root:root 123
```

## 5、ACL访问控制

ACL，是 Access Control List（访问控制列表）的缩写，在 Linux 系统中， ACL 可实现对**单一用户**设定访问文件的权限。

**getfacl命令：查看文件的ACL策略及权限**

**setfacl命令： 给文件针对某个用户或者某个组来增加（设置）ACL策略**

#### 1.getfacl命令

```
getfacl 目标
```

#### 2.setfacl

作用：修改或删除acl权限

- -m ： 修改acl策略

- -x ：去掉某个用户或者某个组的权限

- -b ：删除所有的acl策略

- -R ：递归,通常用在文件夹

mask：mask定义除other和所有人(拥有者)外的最大权限

```powershell
setfacl -m u:用户名:rwx /usr/local/shichangbu  给单个用户单独加权限
setfacl -m g:用户组名:rwx /usr/local/shichangbu   给单个组单独加权限

setfacl -x u:用户 /usr/local/shichangbu  去掉某个用户的权限
setfacl -x g:组名 /usr/local/shichangbu    去掉某个组的acl策略

setfacl -b -R /usr/local/shichangbu  删除所有的acl策略,递归子文件

例如：
setfacl -m u:user01:rw   file1 针对于单个用户给可读可写权限
setfacl -m g:sysadmin:rw file1 针对于单个组给可读可写权限
```

setfacl命令解释

例子：

- 为test2用户在1.txt上设置只读权限
  
  ```
  setfacl -m u:test2:r 1.txt
  ```

示例代码1：给newuser01用户单独在市场部文件夹上增加rx权限

```powershell
mkidr /shichangbu
cd /shichangbu
touch file{1..5}.txt
chown -R root:itheima shichangbu/
递归设置shichangbu文件夹的属主是root，属组是itheima
getfacl shichangbu/

useradd newuser01
passwd newuser01 

setfacl -m u:newuser01:rx -R /usr/local/shichangbu/
单独设置newuser01对于shichangbu文件夹的rx权限，并且递归包含所有子文件

getfacl /usr/local/shichangbu
查看/usr/local/shichangbu文件夹的ACL权限
```

验证newuser01用户对于file1文件只有读权限

示例代码2：给newusergrp组在市场部文件夹上增加rx权限，递归所有子文件

```powershell
groupadd newusergrp
setfacl -m g:newusergrp:rx -R /usr/local/shichangbu/
单独设置newusergrp组对于shichangbu文件夹的rx权限，并且递归包含所有子文件

getfacl /usr/local/shichangbu/
```

示例代码3：删除所有acl策略

```
setfacl -b /usr/local/shichangbu/
```

# 八、服务管理

1.查看服务

命令：systemctl

作用：管理服务

语法：

```
systemctl 选项
```

选项：

- systemctl list-units --type service --all：列出所有服务（包含启动的服务和没启动的）
- systemctl list-units --type service --state running：列出已经启动的服务

### 2.查看服务的状态

命令：systemctl

作用：管理服务

语法：

```
systemctl 选项 目标服务
```

选项:

- status：检查服务的状态

```
systemctl status sshd
```

### 3.启动和停止服务

命令：systemctl

作用：管理服务

语法：

```
systemctl 选项 目标服务
```

选项:

- start：启动服务
- stop：停止服务
- restart：重启服务
- reload：重新加载指定服务的配置文件（不是所有的服务都支持重载）

例子

- 停止crond服务

```
systemctl stop crond
```

- 启动crond服务

```
systemctl start crond
```

- 重启crond服务

```
systemctl restart crond
```

- 重新加载crond服务

```
systemctl reload crond
```

### 4.服务持久化

持久化就是服务是否开机自动启动

命令：systemctl

作用：管理服务

语法：

```
systemctl 选项 目标服务
```

选项:

- enable：指定服务开机自动启动
- disable：禁止服务开机自动启动

例子：

- 禁止crond服务开启启动

```
systemctl disable crond
```

> 禁用了crond服务的开机自动启动

> 重启之后发现crond服务已经关闭了，没有开机自动启动

- 启用crond服务的开机自动启动

```
systemctl enable crond
```

**systemctl参数总结**

| 参数                              | 含义                                         |
| ------------------------------- | ------------------------------------------ |
| list-units --type service --all | 列出所有服务                                     |
| list-u`nits --type service`     | 列出所有启动的服务                                  |
| start                           | 启动指定服务                                     |
| stop                            | 停止指定服务                                     |
| status                          | 检查指定服务的运行状况                                |
| restart                         | 重启指定服务                                     |
| reload                          | 重新加载指定服务的配置文件（并非所有服务都支持reload，通常使用restart) |
| enable                          | 开启 服务开机自动启动                                |
| disable                         | 取消 服务开机自动启动                                |

## 4、firewalld防火墙的配置

#### 1）查看，开启和停止firewalld服务

命令：systemctl

作用：管理服务

语法：systemctl [选项] firewalld

选项：

- status：检查指定服务的运行状况

- start：启动指定服务

- stop：停止指定服务

- restart：重启指定服务

- reload：重新加载指定服务的配置文件（并非所有服务都支持reload，通常使用restart)

**使用systemctl来管理firewalld的服务，具体命令前面已经讲过，只是服务名换成了firewalld，这里不再赘述**

#### 2) 管理firewall配置

命令：firewall-cmd

作用：管理firewall具体配置

语法：firewall-cmd [参数选项1] ....[参数选项n]

##### ①查看默认使用的区域

```
firewall-cmd --get-default-zone
```

##### ②列出当前使用区域配置

```
firewall-cmd --list-all
```

##### ③查看所有可用的区域

```
firewall-cmd --get-zones
```

##### ④列出所有区域的配置

```
firewall-cmd --list-all-zones
```

##### ⑤添加允许通过的服务或端口

> 如果想测试，可以使用python3 -m http.server 80 建立一个简易http服务器，测试防火墙规则，安装python3使用 yum -y install python3

```powershell
示例代码：
firewall-cmd --zone=public --add-port=80/tcp
含义:在public区域，添加允许tcp协议的80端口通过的规则

firewall-cmd --zone=public --add-service=http
含义:在public区域，添加允许http服务通过的规则
```

> 不指定--zone的话，会在默认区域添加规则

- 通过端口添加规则

- 通过服务添加规则

##### ⑥去掉允许通过的服务或端口

```powershell
示例代码：
firewall-cmd --zone=public --remove-port=80/tcp
含义:在public区域，去掉允许tcp协议的80端口通过的规则

firewall-cmd --zone=public --remove-service=http
```

- 通过端口删除规则

- 通过服务删除规则

##### ⑦ 封锁与解封指定的IP

封锁 IP: 192.168.127.152

```shell
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.127.152" reject'
```

解封 IP: 192.168.127.152

```shell
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.127.152" reject'
```

##### ⑧永久模式参数permaent

```powershell
用法七：firewall-cmd --permanent --zone=public --add-port=1024/tcp
含义:在public区域，使用permanent参数，永久添加允许1024端口通过的规则
```

> 相当于把规则写入了配置文件

##### ⑨重新加载配置reload

```powershell
用法七：firewall-cmd --reload
含义:重新加载配置
```

**拓展：** 更多防火墙配置示例

```powershell
# 针对IP开放指定端口                
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="211.23.142.80" port protocol="tcp" port="80" accept"                
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.186.5.90" port protocol="tcp" port="80" accept"                

# 针对IP                
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.233" accept"                
firewall-cmd --permanent --removeadd-rich-rule="rule family="ipv4" source address="192.168.0.233" accept"                

# 针对ip段                
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept"                
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept"                
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept"                

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.186.7.0/24" drop" --timeout=10                

# 当用户来源IP地址是10.0.0.1主机，则将用户请求的5555端口转发至后端172.16.1.7的22端口                    
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7'                    


firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0" accept'    
# 允许192.168.122.0/24主机所有连接。    

firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'    
#每分钟允许2个新连接访问ftp服务。

firewall-cmd --add-rich-rule='rule service name=ftp log limit value="1/m" audit accept'    
#同意新的 IP v4 和 IP v6 连接 FT P ,并使用审核每分钟登录一次。

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0/24" service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept'    
#允许来自192.168.122.0/24地址的新 IPv4连接连接TFTP服务,并且每分钟记录一次。

firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'    
#丢弃所有icmp包    

firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 reject' --timeout=10    
#当使用source和destination指定地址时,必须有family参数指定ipv4或ipv6。如果指定超时,规则将在指定的秒数内被激活,并在之后被自动移除。

firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service    name="dns" audit limit value="1/h" reject' --timeout=300    
#拒绝所有来自2001:db8::/64子网的主机访问dns服务,并且每小时只审核记录1次日志。    

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source    address=192.168.122.0/24 service name=ftp accept'    
#允许192.168.122.0/24网段中的主机访问ftp服务    

firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'    
#转发来自ipv6地址1:2:3:4:6::TCP端口4011,到1:2:3:4:7的TCP端口4012
```

### ​5、计划任务crontab

#### 1)计划任务的作用

作用：操作系统不可能24 小时都有人在操作，有些时候想在指定的时间点去执行任务（例如：每天凌晨 2 点去重新启动Apache），此时不可能真有人每天夜里 2 点去执行命令，这就可以交给计划任务程序去执行操作了。

#### 2)查看计划任务

语法：

```
crontab 选项
```

常用选项：

- -l：list，列出指定用户的计划任务列表
- -e：edit，编辑指定用户的计划任务列表，简单来说，计划任务就是一个文件==
- -u：user，指定的用户名，如果不指定，则表示当前用户
- -r：remove，删除指定用户的计划任务列表

例子：

- 列出当前用户的计划任务列表

```
crontab -l 
```

#### 3)编辑计划任务（重点）

进入计划任务编辑文件

打开计划任务编辑文件后，可以在此文件中编写我们自定义的计划任务：

- 计划任务的规则语法格式，以行为单位，一行则为一个计划：

```
分 时 日 月 周  需要执行的命令
```

- 五个星号默认是每分钟执行

```
* * * * * 命令
```

例如：

- 每天0时0分执行reboot指令。

```
1,2,6 * * * * reboot
```

```powershell
取值范围（常识）：
分：0~59
时：0~23
日：1~31
月：1~12
周：1~7

四个符号：
*：表示取值范围中的每一个数字
-：做连续区间表达式的，要想表示1~7，则可以写成：1-7
/：表示每多少个，例如：想每 10 分钟一次，则可以在分的位置写：*/10
,：表示多个取值，比如想在 1 点，2 点 6 点执行，则可以在时的位置写：1,2,6
```

# 九、进程检测和控制

二、进程管理命令

### 1.top查看 CPU使用情况

命令：top

作用：查看服务器进程占用的资源（100%使用）

语法：top （动态显示）

交互操作快捷键：

- M（大写）：表示将结果按照内存（MEM）从高到低进行降序排列；
- P（大写）：，表示将结果按照CPU 使用率从高到低进行降序排列；
- 1 ：当服务器拥有多个cpu 的时候可以使用“1”快捷键来切换是否展示显示各个cpu 的详细信息；
- q：退出

例子：

- 查看cpu的使用情况

```
top
```

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-28-37-image.png) 

#### 1) 系统整体信息：

①第一行

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-29-03-image.png)

| 内 容                          | 说 明                                                                                    |
| ---------------------------- | -------------------------------------------------------------------------------------- |
| 10:12:28                     | 系统当前时间                                                                                 |
| up 13:05                     | 系统的运行时间.本机己经运行 13 小时 05 分钟                                                             |
| 3 users                      | 当前登录了三个用户                                                                              |
| load average: 0.00,0.01，0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。**如果 CPU 是单核的，则这个数值超过 1 就是高负载：如果 CPU 是四核的，则这个数值超过 4 就是高负载** |

> 扩展：如何获取CPU的总核心数？
> 
> grep 'core id' /proc/cpuinfo |sort -u |wc -l

②第二行

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-29-37-image.png)

| Tasks: 230 total | 系统中的进程总数                 |
| ---------------- | ------------------------ |
| 1 running        | 正在运行的进程数                 |
| 229 sleeping     | 睡眠的进程数                   |
| 0 stopped        | 正在停止的进程数                 |
| 0 zombie         | 僵尸进程数。如果不是 0，则需要手工检查僵尸进程 |

③第三行

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-29-59-image.png)

| 内 容             | 说 明                                                     |
| --------------- | ------------------------------------------------------- |
| Cpu(s): 0.1 %us | 用户模式占用的 CPU 百分比                                         |
| 0.1%sy          | 系统模式占用的 CPU 百分比                                         |
| 0.0%ni          | 改变过优先级的用户进程占用的 CPU 百分比                                  |
| 99.7%id         | idle缩写，空闲CPU 占用的 CPU 百分比                                |
| 0.1%wa          | 等待输入/输出的进程占用的 CPU 百分比                                   |
| 0.0%hi          | 硬中断请求服务占用的 CPU 百分比                                      |
| 0.1%si          | 软中断请求服务占用的 CPU 百分比                                      |
| 0.0%st          | st（steal time）意为虚拟时间百分比，就是当有虚拟机时，虚拟 CPU 等待实际 CPU 的时间百分比 |

④第四行

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-30-24-image.png)

| 内 容                | 说 明                                            |
| ------------------ | ---------------------------------------------- |
| Mem: 1863252 total | 物理内存的总量，单位为KB                                  |
| 829960 used        | 己经使用的物理内存数量                                    |
| 68352 free         | 空闲的物理内存数量。我们使用的是虚拟机，共分配了 628MB内存，所以只有53MB的空闲内存 |
| 96490 buff/cache   | 作为缓冲的内存数量                                      |

⑤第五行

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-30-48-image.png)

| 内 容                 | 说 明            |
| ------------------- | -------------- |
| Swap: 2097148 total | 交换分区（虚拟内存）的总大小 |
| 3336 used           | 已经使用的交换分区的大小   |
| 2093812 free        | 空闲交换分区的大小      |
| 622420 avail Mem    | 可用内存           |

​ 我们通过 top 命令的整体信息部分，就可以判断服务器的健康状态。**如果 1 分钟、5 分钟、15 分钟的平均负载高于CPU核数，说明系统压力较大**。如果物理内存的空闲内存过小，则也证明系统压力较大。

### 2.free查看内存使用情况

命令：free

作用：查看内存使用情况

语法：free -m

选项：

- -m 以mb为单位查看

例子：

- 查看系统内存的使用情况

```
free -m
```

> ![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-33-15-image.png)
> 
> 和Centos6相比，buffer和cached被合成一组，加入了一个available。
> 
> available，即系统可用内存，用户不需要去计算buffer/cache，即可以看到还有多少内存可用，更加简单直观

```powershell
第1行Mem数据：
total 内存总数: 1819
used 已经使用的内存数: 774
free 空闲的内存数: 152
shared 共享内存数: 77
buff/Cache块设备缓存区内存数: 892
available可用内存: 746

第2行数据是Swap交换分区，也就是我们通常所说的虚拟内存。可以在内存不够使用的情况下当临时内存来使用，交换分区并不是越大越好，一般，它就等同于实际内存的大小。
```

### 3.df 查看磁盘

命令：df

作用：查看磁盘的空间(disk free)

语法：df [-h]

选项：

- -h 使用人类可读的形式展示大小

![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-33-40-image.png)

这几列依次是：

| Filesystem | 磁盘名称                  |
| ---------- | --------------------- |
| Size       | 总大小                   |
| Used       | 被使用的大小                |
| Avail      | 剩余大小                  |
| Use%       | 使用百分比                 |
| Mounted on | 挂载路径（相当于Windows 的磁盘符） |

### 4.ps命令查看进程

命令：ps（process show进程显示）

语法：ps [参数选项]

作用：主要是查看服务器的进程信息

选项：

- -e：等价于“-A”，表示列出全部（all）的进程

- -f : 表示full，显示全部的列（显示全字段）

- 查看服务器的进程情况![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-09-38-10-image.png)

```
ps -ef
```

| UID   | 该进程执行的用户ID                                        |
| ----- | ------------------------------------------------- |
| PID   | 进程ID                                              |
| PPID  | 该进程的父级进程ID，如果找不到，则该进程就被称之为僵尸进程（Parent Process ID） |
| C     | Cpu的占用率，其形式是百分数                                   |
| STIME | 进程的启动时间                                           |
| TTY   | 终端设备，发起该进程的设备识别符号，如果显示“?”则表示该进程并不是由终端设备发起         |
| TIME  | 进程实际使用CPU的时间                                      |
| CMD   | 该进程的名称或者对应的路径                                     |

- ps命令配合grep命令筛选某个用户的进程（此处是root用户）

```
ps -ef | grep root
```

- ps命令配合grep命令筛选某个程序的进程（此处是筛选ssh相关进程）

```
ps -ef | grep ssh
```

**扩展**：ps aux BSD格式命令，注意没有横杠"-"

Unix有很多分支，目前主流的显示风格分为System V和BSD，我们之前使用的ps -ef属于system V风格，ps aux是BSD风格，大家可以理解为两种风格只是显示不同。

- USER：该 process 属于哪个使用者账号
- PID ：该 process 的ID
- %CPU：该 process 使用掉的 CPU 资源百分比
- %MEM：该 process 所占用的物理内存百分比
- VSZ ：该 process 使用掉的虚拟内存量 (Kbytes)
- RSS ：该 process 占用的固定的内存量 (Kbytes)
- TTY ：该 process 是在那个终端机上面运作，若与终端机无关，则显示 ?，另外， tty1-tty6 是本机上面的登入者程序，若为 pts/0 等等的，则表示为由网络连接进主机的程序。
- STAT：该程序目前的状态，主要的状态有
  - R ：该程序目前正在运作，或者是可被运作
  - S ：该程序目前正在睡眠当中 (可说是 idle 状态)，但可被某些讯号 (signal) 唤醒。
  - T ：该程序目前正在侦测或者是停止了
  - Z ：该程序应该已经终止，但是其父程序却无法正常的终止他，造成 zombie (疆尸) 程序的状态
- START：该 process 被触发启动的时间
- TIME ：该 process 实际使用 CPU 运作的时间
- COMMAND：该程序的实际指令

### 5.netstat查看网络进程情况

- 使用前需要安装 net-tools

```
yum -y install net-tools
```

命令：netstat

作用：查看网络连接状态

语法：

```
netstat -anpt
```

选项：

- -t：表示只列出tcp 协议的连接；
- -n：表示将地址从字母组合转化成ip 地址，将协议转化成端口号来显示；
- -a : 显示"state（状态）"列中的所有连接。
- -p：表示显示发起连接的进程pid 和进程名称；
- -l ：表示过滤出"state（状态）"列中其值为LISTEN（监听）的连接；

例子：

- 查看当前主机的网络连接情况

```
netstat -anpt
```

```powershell
Protocol：协议（tcp、upd、http、https、icmp、ssh…）
Receive：接收
Send：发送
Local Address:本地地址
Foreign：远程地址
State：状态，LISTEN表示侦听来自远方的TCP端口的连接请求
PID/Program name：进程ID和程序名
```

#### 补充：网络相关的一些命令

#### 1.ping命令

作用：检查网络的连通性

用法：

```
ping ip/域名
```

选项：

- -c 指定发送的报文数

#### 2.ifconfig命令

作用：查看/设置网卡信息

用法：

- 查看
  
  ```
  ifconfig [网卡名]
  ```

- 临时配置网卡ip
  
  ```
  ifconfig 网卡名 ip/子网
  ```

- 禁用和激活网卡
  
  ```
  ifconfig 网卡名 up/down
  ```

- centos7网卡的配置文件路径：
  
  ```
  /etc/sysconfig/network-scripts/ifcfg-ens33
  ```

#### 3.nslookup

作用：测试dns解析

用法：

```
nslookup 域名
```

#### 4.curl

作用：发起http请求

用法：

```
curl 链接
```

#### 5.wget

作用：非交互式的网络文件下载工具

用法：

```
wget 链接
```

### 6.kill关闭进程

命令：kill

语法：kill [信号] PID

作用：kill 命令会向操作系统内核发送一个信号（多是终止信号）和目标进程的 PID，然后系统内核根据收到的信号类型，对指定进程进行相应的操作

| 信号编号 | 含义                     |
| ---- | ---------------------- |
| 9    | 杀死进程，即强制结束进程。          |
| 15   | 正常结束进程，是 kill 命令的默认信号。 |

例子：

- 查询crond程序的PID，并强制结束它
  
  - 查询PID
    
    ```
    ps -ef | grep crond
    ```

- 强制结束crond的进程
  
  ```
  kill -9 6313
  ```

- 查看crond服务的状态

### 7.killall关闭进程

命令：killall

作用：通过程序的进程名来**杀死一类进程**

语法：killall [信号] 进程名称

信号种类：和kill相同，这里不再重复

# 十、SSH服务

### 1.登录ssh

```
ssh 用户名@IP地址，不加用户名则以当前终端用户身份远程连接，如果两端用户名不一样，则需要使用-l username指定用户名
exit  退出远程连接
```

例子：

- kali连接centos
  
  ```
  ssh root@192.168.127.155
  ```

### 2.scp命令

- 将本机文件复制到远程服务器(centos)上（上传）
  
  ```
  scp ./123.txt root@192.168.127.155:/root/test
  ```

- 将远程服务器上的文件复制到本机（下载）
  
  ```
  scp root@192.168.127.155:/root/test/down.txt ./
  ```

注意两点：

1.如果远程服务器openssh有特殊限制，scp便要走特殊端口，具体用什么端口视情况而定，命令格式如下：

```
scp -P 2222 [username]@[主机地址]:/usr/local/sin.sh /home/administrator
```

2.使用scp要注意所使用的**用户是否具有可读取远程服务器相应文件的权限**。

**openssh**默认已经安装于centos中，无须额外的安装。相关的软件包可以通过以下命令进行查询。

```
yum list |grep openssh
```

可使用`systemctl`命令查看和设置openssh服务的状态。

```
systemctl status sshd    #查看ssh状态
systemctl start sshd     #启动ssh服务
systemctl stop sshd     #停止ssh服务
```

## 3.公钥私钥

登陆方法

- 首先生成一对密钥

```
ssh-keygen -t rsa
```

- 把id_rsa.pub公钥文件放到想要登录的用户的 ~/.ssh/目录中，并改名为authorized_keys
  
  ```
  cd /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
  ```

- 把私钥文件放到想要远程登录的机器上
  
  > 可以使用scp
  > 
  > ![](C:\Users\12151\AppData\Roaming\marktext\images\2026-07-21-17-55-42-image.png)

- 使用私钥登录
  
  > 不用密码就可以登录了
  
  ```
  ssh -i id_rsa root@192.168.127.155
  ```

## 4、openssh配置文件与加固

OpenSSH常用配置文件有两个`/etc/ssh/ssh_config`和 `/etc/ssh/sshd_config`。

- `ssh_config`为客户端配置文件。

- `sshd_config`为服务端配置文件。

我们实验修改的皆为**sshd_config**，即服务端配置文件，为的是规定主机**被远程登录时**的状态。

#### 实验1：修改 SSH 默认端口

```
vim /etc/ssh/sshd_config
```

- 在配置文件中 Port 2222 这一行

- 重启sshd服务

```
systemctl restart sshd
```

- 查看当前ssh服务的监听端口

- 使用ssh命令行工具连接
  
  ```
  ssh -p  2222 root@192.168.127.155
  ```

#### 实验2：配置ssh日志

在此实验中，将学习在ssh配置文件中配置ssh日志。

```
vi /etc/ssh/sshd_config    
```

`SyslogFacility AUTHPRIV` 表示当有人使用ssh登录系统时，ssh会记录信息，记录类型为AUTHPRIV。 `#LogLevel INFO`表示设置记录sshd日志信息的级别。

`SyslogFacility`一项，规定了服务日志的性质，也规定了服务日志存储的默认路径。

如：`AUTHPRIV` 表达了日志记录的是包含敏感信息的用户身份验证消息，默认存储于`/var/log/secure`。

`AUTH` 则表达了日志记录的是不包含敏感信息的用户身份验证消息，同样默认存储于`/var/log/secure`。

ssh配置文件的这一字段一般是不需要修改的。在LInux系统的其他服务配置文件中，你可能会遇见`SyslogFacility`设置为其他状态的情况，可以通过下表了解其含义。

| 设置           | 描述                                 | 默认日志文件                          |
| ------------ | ---------------------------------- | ------------------------------- |
| **local0**   | BIG-IP 特定消息                        | **/var/log/ltm**                |
| **local1**   | EM 特定消息 APM 特定消息                   | **/var/log/em /var/log/apm**    |
| **loacl2**   | GTM 和链路控制器特定消息                     | **/var/log/gtm**                |
| **local3**   | ASM 特定消息                           | **/var/log/asm**                |
| **loacl4**   | ITCM 门户和服务器 (iControl) 特定消息        | **/var/log/ltm**                |
| **loacl5**   | 包过滤特定消息                            | **/var/log/pktfilter**          |
| **loacl6**   | HTTPD 特定消息                         | **/var/log/httpd/httpd_errors** |
| **loacl7**   | Linux 特定的引导消息                      | **/var/log/boot.log**           |
| **cron**     | 与**cron**进程相关的消息                   | **/var/log/cron**               |
| **daemon**   | 与系统守护进程相关的消息（包括**named**和**ntpd**） | **/var/log/daemon.log**         |
| **kern**     | 内核消息                               | **/var/log/kern.log**           |
| **mail**     | 邮件系统消息                             | **/var/log/maillog**            |
| **auth**     | 不包含敏感信息的用户身份验证消息                   | **/var/log/secure**             |
| **authpriv** | 包含敏感信息的用户身份验证消息                    | **/var/log/secure**             |
| **user**     | 与用户进程相关的消息                         | **/var/log/user.log**           |

`#LogLevel INFO`表示设置记录sshd日志信息的级别。可以理解为设置了日志的详细程度。

`INFO`级别代表了日志会报告大部分有用信息，是较为详细的日志等级，除此外，还有其他等级：

| 等级          | 描述               | 冗长度  |
| ----------- | ---------------- | ---- |
| **emerg**   | 紧急系统紧急信息         | 最低限度 |
| **alert**   | 需要管理员干预的严重错误     | 低的   |
| **crit**    | 严重错误，包括硬件和文件系统故障 | 低的   |
| **err**     | 非关键但可能非常重要的错误消息  | 低的   |
| **warning** | 至少应该记录以供审查的警告消息  | 中等的  |
| **notice**  | 包含有用但可能会被忽略的消息   | 中等的  |
| **info**    | 包含有用但可能会被忽略的消息   | 高的   |
| **debug**   | 含有最详细的信息         | 最大值  |

将此条注释取消，将其修改为`LogLevel DEBUG`，重启ssh服务，观察修改前后日志详细度的变化。

```
tail -f /var/log/secure        查看日志
LogLevel DEBUG
systemctl restart sshd.service    重启服务
ssh 192.168.229.135  使用kali进行ssh连接
tail -f /var/log/secure        查看日志
```

#### 实验3：禁止root用户登录

```
vim /etc/ssh/sshd_config
```

- / 搜索 PermitRootLogin

- 取消注释，并设置PermitRootLogin 为 no

- 重启sshd服务
  
  ```
  systemctl restart sshd
  ```

- 最终效果，root用户无法登录

#### 实验4：配置长时间无操作自动断开ssh链接

##### 1.认证阶段长时间无操作断开连接

- 指定时间内没有成功登录（密码认证阶段），会断开连接

在配置文件37行的`#LoginGraceTime 2m`

##### 2.登录后长时间无操作断开连接

- 修改**登录成功后**长时间无操作断开：在配置文件`/etc/profile`末尾加上

```bash
vi /etc/profile
export TMOUT=10      单位是秒，时间太短来不及敲命令
```

- 执行该命令，使配置文件生效

```
source /etc/profile        重新加载系统环境变量文件 /etc/profil
```

可以看到，当命令终端超过10秒无人操作，ssh连接自动断开了。

**实验结束后将其改回，避免影响后续实验。**

#### 实验5：开启空口令登录

**慎用！禁用！**

配置文件`/etc/ssh/sshd_config`64行的`PermitEmptyPasswords no`，默认设置禁止空口令登录，将其取消掉`#`注释并将`no`改为`yes`，更改完后记得**重启**sshd服务使配置文件生效

```
vi /etc/ssh/sshd_config
systemctl restart sshd
```

注：使用空口令登录须开启密码认证

清除zhangsan用户密码

```
passwd -d zhangsan
```

测试空口令登录成功

实验结束后将其改回，避免影响后续实验。

#### 实验6：访问速度调优

```
vi /etc/ssh/sshd_config
```

将此两行改为no可解决ssh链接慢的问题

```bash
GSSAPIAuthentication no      #关闭GSSAPI认证
UseDNS no                    #关闭DNS解析
```

```
systemctl restart sshd.service    重启sshd服务使配置文件生效
```

一般 SSH 依次进行的认证方法的是 publickey, gssapi-keyex, gssapi-with-mic, password。 一般用户只使用 password 认证方式，但前面 3 个认证过程系统还是会尝试，这就浪费时间了，也就造成 SSH 登录慢。GSSAPI 主要是基于 Kerberos 的，因此要解决这个问题也就变成要系统配置有 Kerberos， 一般用户是没有配置 Kerberos的。

#### 实验7：启用密码策略

> ```
> minlen = 8
> minclass = 4
> maxrepeat = 2
> maxclassrepeat = 2
> lcredi = 1
> ucredit = 1
> dcredit = 1
> ocredit = 1
> ```

启用密码策略有两个配置文件： 第一个是`/etc/login.defs` ，修改文件里的策略

```bash
vi /etc/login.defs
PASS_MAX_DAYS 99      #密码99天过期
PASS_MIN_DAYS  1      #修改密码最小间隔为1天
PASS_MIN_LEN   8      #密码最短长度为8
PASS_WARN_AGE  1      #密码过期前1天内通知用户
```

第二个配置文件为：`/etc/security/pwquality.conf`

```
vi /etc/security/pwquality.conf
```

```
# "N" 处应填写数字
minlen=N              #定义用户密码的最小长度； 
minclass=N            #定义密码必须满足同时有几种字符；
maxrepeat=N           #定义密码中允许几个连续相同的字符；    
maxclassrepeat=N      #定义用户密码连续字符的最大数目；
lcredit=N             #定义用户密码中必须包含多少个小写字母；
ucredit=N             #定义用户密码中必须包含多少个大写字母；1
dcredit=N             #定义用户密码中必须包含多少个数字；1
ocredit=N             #定义用户密码中必须包含多少个特殊字符（除数字、字母之外）；其中 = 1表示，至少有一个
```

## 5、ssh 的日志

ssh服务的日志存储于`/var/log/secure`。 `tail -f /var/log/secure` 大家可以自由定制所想查看的日志，例如模拟登录失败，登录成功等不同方式，以观察日志的不同变化。 状态:

- Failed password 为密码错误
- Accept password 为登录成功
- disconnected by user 为断开链接
