---
title: "Linux基础"
id: "3424"
type: "post"
slug: "linux%e5%9f%ba%e7%a1%80"
published_at: "2024-05-07T05:49:12+00:00"
modified_at: "2024-05-07T05:49:12+00:00"
url: "https://seq.ink/all/linux/3424.html"
markdown_url: "https://seq.ink/all/linux/3424.html.md"
excerpt: "Linux基础 一、文件和目录操作 列出当前目录中的文件和子目录 ls 全称List，用于打印当前目录下的子目录和文件。 ls ls *.txt #显示当前目录中子目录的所有以.txt结尾的文件 ls常用选项 选项 选项全称 作用 -a A ..."
taxonomy_category:
  - "Linux"
---

# Linux基础

## 一、文件和目录操作

### 列出当前目录中的文件和子目录

`ls` 全称List，用于打印当前目录下的子目录和文件。

```
ls
ls *.txt #显示当前目录中子目录的所有以.txt结尾的文件
```

ls常用选项

| 选项 | 选项全称 | 作用 |
| --- | --- | --- |
| -a | All | 用于显示所有文件和目录，包括隐藏文件和隐藏目录。 |
| -1 |  | 将ls的输出变为一列显示，对于查看大量文件或目录时，特别有用，因为它可以更清晰地列出它们。 |
| -l | Iong format | 以"长格式" 显示文件和目录的详细信息。这个选项通常用于列出文件的权限、所有者、组、文件大小、修改日期等信息。 |
| -h | Human-readable | 将以人类可读的方式列出当前目录中的文件和子目录，并显示文件大小以K、M、G等单位。 |

```
ll  #ls -l的缩写
```

> `ll` 是一个常见的 Linux 命令的别名或缩写，通常用于列出文件和目录的详细信息。实际上，`ll` 命令通常是 `ls -l` 的简写形式。`ls -l` 用于以长格式列出文件和目录的信息，包括权限、所有者、组、大小、修改时间等等。
> 
>  所以，运行 `ll` 命令等同于运行 `ls -l` 命令，都可以用来查看目录中的文件和目录的详细信息。这样的输出通常更详细，有助于用户更好地了解文件和目录的属性。请注意，`ll` 命令在一些 Linux 系统中默认是可用的，但在其他系统中可能需要手动设置别名或使用。
> 
>  如果您在终端中运行 `ll` 命令，它将列出当前目录中的文件和目录的详细信息，类似于运行 `ls -l` 的效果。

### 创建文件

```
touch 文件名
```

使用 `touch` 如果文件不存在则创建，如果存在则 `touch` 命令可以更新文件的访问时间和修改时间，使其变为当前时间，而文件内容不会改变。

可以使用以下形式多次批量创建文件

```
touch a1.txt a2.txt a3.txt
touch a{1..3}.txt
```

在创建文件时 文件名前面加上 `.` 可以创建隐藏文件

```
touch .test.txt
```

使用 `ls -a` 查看隐藏文件

> 在Linux中，以点（`.`）开头的文件和目录被视为隐藏的。通常，使用`ls`命令只会显示普通的文件和目录，而隐藏的文件和目录不会被列出。但是，当您使用`ls -a`或`ls --all`时，它会显示当前目录下的所有文件和目录，包括那些以点开头的隐藏文件和目录。这对于查看隐藏文件或在特定情况下查看所有内容非常有用。

使用’touch’加上路径可以在目标路径中创建文件

```
# 在当前目录下创建
touch index/css/main.css # 在当前目录下创建
# 指定其他目录创建
touch /tmp/test.txt # 在根目录下的tmp文件夹中创建一个test文本文件
```

> 在使用Linux系统时，创建文件夹（目录）时不需要添加 `./` 前缀，直接使用 `mkdir test` 即可。这是因为Linux默认会在当前目录下创建文件夹，所以不需要额外的路径指定符号。所以，`mkdir test` 是正确的方式来创建一个名为 test 的文件夹。

### 创建目录

`mkdir` 命令的全称是 "make directory"，它用于在Linux和Unix操作系统中创建新的目录（文件夹）。这个命令可以让你在文件系统中创建新的目录结构，以组织和存储文件和子目录。

```
mkdir 目录名 # 创建目录
mkdir -p index/css #创建多级子目录
mkdir a b c # 创建多个目录
mkdir a{1..10} #创建多个目录
```

### 切换目录

`cd` 指令的全称是 "change directory"，它用于在命令行界面中改变当前工作目录。这个命令允许用户进入不同的目录或文件夹，以便在文件系统中导航和执行命令。通过使用 `cd` 命令，用户可以切换到其他目录并在其中执行操作。

```
cd [目标路径]
```

在使用cd指令时 可以搭配一些符号快速的定位到目录

| 符号 | 作用 |
| --- | --- |
| ~ | 表示当前用户的家目录（home directory）。当你运行 cd ~ 时，它会将你的当前工作目录更改为你的家目录。 |
| / | 符号表示根目录（root directory）。根目录是文件系统的最顶层目录，包含了整个文件系统的层次结构。运行 cd / 时，它会将你的当前工作目录更改为根目录。 |
| . | 表示当前目录。例如，cd . 不会改变当前工作目录。 |
| .. | 表示上一级目录。例如，cd .. 将会将你的当前工作目录更改为上一级目录。 cd../.. 将会将你的当前工作目录更改为上二级目录。 |
| – | 表示上一次工作的目录。使用 cd - 可以快速切换回之前所在的目录。 |

当目标目录没有可执行（x）权限时，你无法使用 `cd` 命令进入该目录。

### 删除文件 目录

`rm` 的全称是 "remove"，它是 Linux 和 Unix 操作系统中用于删除文件或目录的命令。

```
rm 目标文件 # 删除文件
rm -r 目标目录 #删除目录
rm 目标文件1 目标文件2 # 删除多个文件
rm *.txt # 删除以.txt结尾的文件
```

`rm` 常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -r | Recursive | 递归删除，用于删除目录及其内容 |
| -f | Force | 强制删除，无需确认。 |
| -i | Interactive | 交互式删除，会提示用户确认删除。 |

> 在删除文件或目录时，通常需要对目标文件或目录同时具备写权限和执行权限。使用 `-f` 参数可以绕过权限检查，强制删除，但目标文件的父目录也需要具备足够的权限，包括读、写和执行权限，以确保删除操作成功。需要谨慎使用 `-f` 参数，因为它可能导致误删除文件或目录。

### 移动文件 目录 重命名

`mv` 全称move，它用于在Linux和Unix系统中移动或重命名文件和目录。使用 `mv` 命令，您可以将文件或目录从一个位置移动到另一个位置，也可以重命名文件或目录。

```
mv 源文件 将目标文件要移动到的路径 # 移动
mv oldfile.txt newfile.txt # 重命名
```

> 当使用`mv`命令移动文件时，文件的属主和属组信息通常不会发生改变，除非你以超级用户或具有适当权限的用户身份执行`mv`命令并明确指定要更改文件的属主和属组。此外，需要注意的是，Linux文件系统通常不维护文件的创建时间戳，因此移动文件不会影响到创建时间戳。此外，移动文件不需要读取文件本身的权限，只需要对文件所在目录具有执行权限（用于访问目录）和对目标目录具有写权限（用于将文件移动到目标目录）。

### 复制文件 目录

`cp` 全称copy，它用于在Linux和Unix系统中拷贝文件或目录。

```
cp [源文件] [目标目录或文件]
cp -r [目标目录] [将目标目录拷贝的路径]
```

cp常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -r | Recursive | 递归复制目录，复制目录及其内容。 |
| -p | Preserve | 保留文件属性，保留文件的权限、所有者和时间戳等属性。 |
| -f | Force | 强制覆盖，如果目标文件已经存在，你可以使用-f选项来强制覆盖它。 |
| -v | Verbose | 显示复制进度 |
| -i | Interactive | 交互式复制，使用-i选项可以在覆盖目标文件之前进行交互式确认。 |

> 要复制一个文件，你需要对源文件具有读权限，同时对目标目录具有写权限。如果目标文件没有读权限，复制操作将失败。

### 查看文件

#### 常用指令

```
cat 文件名 # 查看文件
cat -n 文件名 # 查看的同时显示行号
tac 文件名 # 倒序查看
head 文件名 # 查看文件前10行 默认
head -15 文件名 # 查看文件前15行
tail 文件名 #查看文件倒数10行 默认
tail -15 #查看文件倒数15行
tail -f #检测文件变化
```

#### 统计指令 `wc`

`wc` 命令的全称是 "word count"，它用于统计文本文件中的字数、行数和字符数。除了这些基本的统计信息，`wc` 命令还可以提供更多选项，例如统计文件中的字节数、最长行的长度等。它是 Linux 和 Unix 操作系统中非常常用的命令之一，用于文本文件的分析和处理。

```
wc 文件名
```

wc 常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -l | lines | 用于统计行数 |
| -w | words | 用于统计字数（单词数） |

#### 匹配指令 `grep`

`grep` 的全称是 "Global Regular Expression Print"，它是一个用于在文本文件中搜索匹配特定模式（正则表达式）的行的命令。

```
grep [选项] [模式] [文件名]
```

**基本搜索**： 默认情况下，`grep` 会搜索匹配指定模式的行并将其输出到标准输出。例如，以下命令搜索文件 `file.txt` 中包含字符串 "pattern" 的行：

```
grep "pattern" file.txt
```

**正则表达式搜索**： `grep` 支持正则表达式，你可以使用 `-E` 选项来进行扩展正则表达式的搜索。例如，以下命令搜索文件中以字母 "a" 开头的单词：

```
grep -E "^a\w*" file.txt
```

**忽略大小写**： 使用 `-i` 选项可以忽略搜索时的大小写区分。例如，以下命令搜索文件中包含字符串 "pattern" 的行，不区分大小写：

```
grep -i "pattern" file.txt
```

**显示行号**： 使用 `-n` 选项可以显示匹配行的行号。例如，以下命令搜索文件中包含字符串 "pattern" 的行，并显示行号：

```
grep -n "pattern" file.txt
```

**反向匹配**： 使用 `-v` 选项可以输出不包含匹配模式的行。例如，以下命令搜索文件中不包含字符串 "pattern" 的行：

```
grep -v "pattern" file.txt
```

**精确匹配**： 使用 `-w 选项可以输出包含莫一个单词的行。例如，以下命令搜索文件中不包含字符串 "pattern" 的行：

```
grep -w "pattern" file.txt
```

#### 列数据匹配 `awk`

`awk` 是从其三位创始人的姓名首字母派生而来的，这三位创始人是 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan。

```
awk '{print $1}' # 取第一列数据
awk -F ',' '{print $1}' # 以，为分隔符
```

#### 排序 `sort`

`sort` 指令用于对文本文件的内容进行排序并将结果输出到标准输出。

```
sort [选项] [文件名]
```

`sort` 常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -r | Reverse | 逆序排序，即从大到小排序。 |
| -n | Numeric-sort | 选项可以按数字顺序而不是字典顺序进行排序。 |
| -b | Blanks | 可以在排序时忽略前导空格。 |

#### 去重 `uniq`

`uniq` 是 "unique" 的缩写，它用于从已排序的文本文件中删除或报告重复的行，并将结果输出到标准输出。需要注意的是，如果文件没有排序，则 `uniq` 无法正确去重。

```
uniq [选项] [输入文件]
```

`uniq` 常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -c | count | 显示每个重复行出现的次数。使用此选项，uniq 将在每个行的前面显示该行出现的次数。 |

## 二、Linux目录结构

Linux没有盘符的概念，而是一个单根文件系统，根目录`/`是最顶级的目录。

```
/ 根目录是整个Linux文件系统的起点，包含了所有其他目录和文件。
├── bin  （二进制文件 Binaries）bin存放了系统启动和基本操作所需的核心命令，这些命令通常被系统启动过程中使用，因此需要在根文件系统中。
├── boot    （引导文件）boot目录包含了引导加载程序和内核镜像，用于引导Linux系统。这些文件是启动计算机时所需的。
├── dev （设备文件 Device）dev包含设备文件，用于访问系统硬件设备，如磁盘驱动器、键盘、鼠标等。在Linux中，一切皆文件，因此硬件设备也以文件的形式表示。
├── etc （配置文件 Etcetera）etc存放系统的配置文件，包括网络配置、用户和组信息、软件包配置等。系统管理员可以在这里配置系统的行为和各种服务。
├── home    （用户主目录）home目录包含了每个用户的主目录，每个用户有自己的子目录。
│   └── user1 (user1用户主目录)用户通常在自己的主目录下存储个人文件和设置。
├── lib     （库 Library）32位库文件 lib存放系统和应用程序所需的共享库文件。共享库包含了可供多个程序共享使用的代码和函数。
├── lib64   64位库文件
├── media （可移动媒体）media用于挂载可移动媒体设备，如USB驱动器、光盘等。
├── mnt（挂载点 mouent） mnt目录通常用于手动挂载其他文件系统，例如临时挂载其他硬盘分区或网络文件共享。
├── opt （可选软件包） opt通常用于存放可选的、独立安装的软件包。一些应用程序和服务可以选择安装在这个目录下。
├── proc    （进程和系统信息）proc包含虚拟文件系统，用于访问内核和进程信息。
├── root    （超级用户主目录）root是超级用户（管理员）的主目录。超级用户可以在这里存储个人文件和配置。
├── run （运行时文件）run包含运行时数据，如临时文件和进程信息。
├── sbin    （系统二进制文件）sbin存放系统管理和维护所需的二进制可执行文件，通常只能由超级用户运行。
├── srv （服务数据 Serve）srv通常用于存储服务相关的数据文件，例如Web服务器的文档根目录。
├── sys （内核和设备信息 system）sys包含了内核和设备的信息，可以用于配置和监视硬件设备和内核参数。
├── tmp （临时文件）tmp用于存储临时文件，这些文件在系统重启时通常会被清除。
├── usr （用户安装的软件和文件） usr包含用户安装的软件包、应用程序和文件
└── var（变化的数据）var包含变化的数据，如日志文件、缓存、邮件队列等。这些文件经常被写入和修改。
```

### 网安常用目录

| 路径 | 描述 |
| --- | --- |
| /etc/skel | 用作新用户的默认home目录模板。当系统管理员创建新用户时，系统会使用 /etc/skel 目录中的文件和文件夹作为新用户家目录的初始内容。这些文件和文件夹包含了一些默认的配置文件、示例文件以及其他系统和用户环境所需的基本文件。 |
| /etc/passwd | 用于存储有关系统中用户账户的基本信息。每行记录代表一个用户账户，并由冒号分隔的字段组成。 |
| /etc/group | 用于存储系统中用户组信息的文件。在Linux和Unix系统中，用户通常被组织成不同的用户组，这有助于管理和授权文件和资源的访问。 |
| /etc/shadow | 通常用于存储 Linux 和 Unix 操作系统中的用户密码信息。它包含了一些关键的安全性数据，用于保护用户账户的密码。 |
| /var/spool/mail | 用于存储用户的电子邮件邮箱（邮件信箱）文件。每个用户通常都有一个与其用户名相关联的邮箱文件，该文件包含了用户接收的电子邮件消息。 |
|  |  |

### **可执行程序特殊目录**（环境变量目录）

在Linux中，有一个特殊的目录，被称为可执行程序的特殊目录，通常是 `/usr/local/bin` 或 `/usr/bin`，其中包含了系统中安装的可执行程序的文件。这些可执行程序可以直接从命令行运行，而无需提供完整的文件路径。以下是有关这个特殊目录的解释：

1. **目的**：可执行程序的特殊目录用于存放系统上安装的可执行二进制文件（也就是可运行的程序）。这些程序可以是系统工具、应用程序或其他可以通过命令行或脚本调用的工具。
2. **环境变量**：Linux系统中有一个叫做 `$PATH` 的环境变量，它包含了一系列目录的路径，系统会在这些目录中查找可执行程序。当你在命令行输入一个命令时，系统会按照 `$PATH` 中列出的目录顺序来查找对应的可执行程序，一旦找到，就可以运行它。默认情况下，可执行程序的特殊目录通常被包含在 `$PATH` 变量中。
3. **系统与用户级别**：在Linux系统中，有两个主要的可执行程序目录，分别是 `/usr/bin` 和 `/usr/local/bin`。
  - `/usr/bin`：包含系统级别的可执行程序，通常由Linux发行版提供和维护，包括系统工具和常见的应用程序。
  - `/usr/local/bin`：通常包含由管理员或用户安装的本地可执行程序。这个目录用于存放不属于Linux发行版默认安装的自定义或第三方程序。

4. **权限和安全性**：这些目录通常设置为具有较高的安全性，只有超级用户（root）或具有适当权限的用户才能将可执行程序复制或安装到这些目录中。这有助于确保系统上的可执行程序是受信任和安全的。

总之，可执行程序的特殊目录在Linux系统中起着重要作用，使用户能够轻松地运行各种命令和应用程序，同时保持了系统的安全性和组织性。通过设置正确的 `$PATH` 环境变量和合适的权限，Linux系统能够有效地管理和运行可执行程序。

```
echo $PATH #可以通过echo指令打印PATH变量获得可执行程序特殊目录
```

## 三、用户与用户组

在Linux系统中，用户（User）和用户组（User Group）是关键的身份和权限管理概念，用于管理系统上的访问和资源分配。

### 用户相关操作

- 用户是Linux系统中的个体身份，它用于标识和区分不同的系统用户。
- 每个用户都有一个唯一的用户名（Username），例如 "john" 或 "mary"。
- 每个用户都有自己的主目录（Home Directory），通常位于 `/home` 目录下，用于存储用户的个人文件和配置。
- 用户可以登录到系统，执行命令，访问文件，以及拥有自己的文件和目录权限。
- 用户通常分为普通用户（普通用户）和超级用户（root用户）。超级用户拥有系统上的最高权限，可以执行任何操作。

#### 创建用户

```
useradd [用户名] #新建用户 如果没有指定组名则创建一个与用户名相同的组,并且将该用户归于此下。
useradd -g [组名] [用户名] #新建用户 指定组
```

在创建用户后，可以使用 `id` 命令来检查是否创建成功。如果 `id` 命令输出用户的 UID、GID 以及所属的组信息，那么说明用户已成功创建。然而，此时仍然无法正常登录，原因在于尚未为该用户设置密码。

> 值得注意的是，在执行成功的时刻，系统会在用户的主目录下生成一个目录，该目录的名称与用户的 ID 相匹配，并且其内容是从 `/etc/skel` 复制而来的。

```
passwd [用户名] #设置或修改密码
```

在用户设置完成密码后，可以正常登录。

#### 删除用户

```
userdel [用户名]  # 仅删除用户账户，不删除用户的主目录和邮件队列
userdel -r [用户名] # 不仅用户账户被删除，还会连同用户的主目录和邮件队列一起删除。
```

> 如果您希望仅删除用户账户而保留用户的数据（如主目录中的文件），则使用 `userdel`。如果您想要彻底删除用户账户及其所有相关数据，包括主目录 邮件队列，那么可以使用 `userdel -r`

#### 修改用户

使用 `usermod` 指令可以修改用户状态

```
usermod [选项] [用户名]
```

`usermod` 常用选项

| 选项 | 英文全称 | 作用 |
| --- | --- | --- |
| -L | Lock | 锁定用户账号 |
| -U | Unlock | 解锁用户账号 |
| -G | Groups | 给用户添加一个新的组 |
| -g | gid | 修改用户主组 |

#### 查看用户

```
id [用户名] # 命令输出用户的 UID、GID 以及所属的组信息
lchage -l [用户名] # 查看用户状态
W   #查看当前登录了几个用户或者打开了多少个终端
```

### 用户组相关操作

- 用户组是一组用户的集合，它用于管理和分配权限。
- 每个用户可以属于一个或多个用户组。
- 用户组可以协助在多个用户之间共享文件和资源，使权限管理更灵活和有效。
- 通常，每个用户创建时都会自动分配一个与其用户名相同的用户组，称为主用户组。
- 用户也可以加入其他用户组，以便与其他用户协作并访问特定资源。

#### 创建组

```
groupadd [组名]
```

#### 删除组

```
groupdel [组名]
```

#### 修改组名

```
groupmod -n [旧组名] [新组名]
```

## 四、权限管理

在Linux操作系统中，文件和目录的权限是一个重要的概念，用于控制谁可以访问、修改或执行它们。Linux使用一种称为“权限位”（permission bits）的系统来管理文件和目录的权限。每个文件或目录都有一个与之相关联的权限设置，这些权限设置分为三个主要类别：用户权限、组权限和其他人权限。

1. 用户权限（User Permissions）：
  - 读权限（Read）：表示用户是否可以查看文件的内容。如果文件有读权限，则用户可以读取文件的内容。
  - 写权限（Write）：表示用户是否可以修改文件。如果文件有写权限，则用户可以编辑、修改或删除文件。
  - 执行权限（Execute）：表示用户是否可以执行文件。对于二进制文件（如可执行程序），执行权限允许用户运行文件。对于目录，执行权限允许用户访问目录内的文件列表。

2. 组权限（Group Permissions）：
  - 与用户权限类似，组权限决定了属于同一用户组的用户对文件或目录的访问权限。这些权限通常适用于多个用户属于同一用户组的情况。

3. 其他人权限（Other Permissions）：
  - 这些权限适用于不是文件拥有者或不属于文件所在组的其他用户。这些权限通常适用于所有其他用户。

每个文件或目录的权限位以一种特殊的方式表示，通常以以下形式显示：rwxrwxrwx。这个字符串分为三组，每组包含三个权限位，分别表示用户权限、组权限和其他人权限。每个权限位可以用一个字母或一个符号表示：

- r：读权限
- w：写权限
- x：执行权限
- -：无权限

例如，rw-r–r– 表示文件拥有者有读和写权限，但没有执行权限；文件所在组和其他人只有读权限，没有写和执行权限。

### 文件权限

输入`ls -l`或`ll`指令可以，以"长格式" 显示文件和目录的详细信息。

```
总用量 4
-rw-------. 1 root root 1304 8月  25 20:45 anaconda-ks.cfg
drwxr-xr-x  2 root root    6 9月  20 02:12 doc
-rw-r--r--  1 root root    0 9月  20 02:04 op.txt
```

当你到像 `-rw-r--r--` 这样的字符串时，它表示文件或目录的权限设置。这个字符串总共包含了十个字符，可以分成四组，每组包含三个字符。每一组都代表了不同的访问权限，分别是用户权限、用户组权限和其他用户权限。具体来说，这个字符串可以解释如下：

- `rw-`：这是用户权限部分，表示文件或目录的拥有者（用户）具有读取（r）和写入（w）的权限，但没有执行（x）的权限。
- `r--`：这是用户组权限部分，表示与文件或目录属于相同用户组的人只有读取（r）的权限，没有写入（w）或执行（x）的权限。
- `r--`：这是其他用户权限部分，表示所有其他用户都只有读取（r）的权限，没有写入（w）或执行（x）的权限。

因此，`-rw-r--r--` 表示文件或目录的拥有者可以读取和写入，与文件或目录属于相同用户组的人可以读取，而所有其他用户也只能读取，没有其他的权限。文件类型字符 `-` 表示这是一个普通文件。如果文件类型字符是 `d`，则表示这是一个目录。

使用`chmod`指令修改文件或文件夹权限

```
chmod [选项位] [文件/文件夹]
chomd -r anaconda-ks.cfg #去除掉三组所有的读权限
chomd o+r anaconda-ks.cfg #只给其他人添加读取权限
```

在选项位中，权限的基本格式是 `权限体系ugo` `+ 或 -` `权限符号rwx`。你可以按需使用这些符号来配置文件或目录的权限。如果省略权限体系位，则所设置的权限将对所有三个权限体系（用户、组、其他用户）都生效。同时，你也可以组合不同的权限设置来达到特定的权限配置目的。

例如，`chmod ug+rwx anaconda-ks.cfg` 表示给文件 "anaconda-ks.cfg" 的用户和组添加读、写和执行权限。

### 目录权限

与文件权限相同目录文件的权限也是用rwx表示。

1. **r（读权限 – Read）**：读取目录内容的权限。如果一个用户具有读权限，他们可以列出目录中的文件和子目录，查看文件和目录的属性信息，但不能对目录内的文件执行写入或删除操作。
2. **w（写权限 – Write）**：写入目录的权限。如果一个用户具有写权限，他们可以在目录中创建新文件或子目录，也可以删除已存在的文件或子目录。写权限还允许用户更改目录的属性，如修改目录的名称。
3. **x（执行权限 – Execute）**：执行目录的权限。虽然执行权限通常与文件相关联，但在目录上具有执行权限允许用户进入（或"切换到"）该目录。用户需要具有执行权限才能访问目录中的文件，即使他们知道文件的名称。

### 权限值

在Linux和Unix系统中，文件和目录的权限是用数字值来表示的，通常是一个三位的八进制数。这个三位数字代表了不同的权限组：文件的拥有者权限、文件所属用户组的权限和其他用户的权限。每个权限组都由三个比特位组成，每个比特位可以是以下几个值：

1. **r（读权限 – Read）**：用数字表示为4。如果这个位被设置为4，表示拥有该权限。
2. **w（写权限 – Write）**：用数字表示为2。如果这个位被设置为2，表示拥有该权限。
3. **x（执行权限 – Execute）**：用数字表示为1。如果这个位被设置为1，表示拥有该权限。
4. **-（无权限）**：用数字表示为0。如果这个位被设置为0，表示没有该权限。

这三个比特位对应于每个权限组的读、写和执行权限。将它们组合在一起，可以创建一个三位的数字权限值，例如：

- `rwxr-xr--` 权限对应的数字权限值是 751。
- `rw-rw-r--` 权限对应的数字权限值是 664。
- `rwxr-x---` 权限对应的数字权限值是 750。

了解了权限值后就可以使用权限值快速的操作文件权限，例如：

```
chomd 751 anaconda-ks.cfg #创建他的用户有读写执行权限，用户组有读和执行权限，其他用户只有执行权限。
```

### 修改文件/目录所属

> 只有超级用户（root）或具有足够权限的用户可以将文件的属主更改为其他用户，即使文件的当前属主和目标用户属于同一用户组，普通用户也不能直接执行这个操作。

```
chown test1 index.html #将index.html的属主交给test1
chown test:test1 #将index.html的属组和属组交给test1 [用户名:组名]
chown 1001:1001 #也可以通过uid和gid进行修改   [uid:gid]
```

## 五、压缩与解压缩

linux系统下不太的压缩格式是需要不同命令操作

### tar

```
tar -zcf [压缩包路径/文件名称] [文件] #压缩 文件可以使用空格指定多个
tar -zxf [压缩包路径] [解压路径] #解压
tar -cf [归档路径/文件名称] [文件] #归档 文件可以使用空格指定多个
tar -tf [压缩包路径] #查看压缩包内容
```

> 归档通常指的是将一组文件或目录集合在一起但不压缩，以便将它们存储为单个文件或目录，以便于备份、传输或存档目的。
> 
>  在命名时 tar压缩一般是用`文件名.tar.gz`的格式书写

常用参数

| 选项 | 全称 | 作用 |
| --- | --- | --- |
| z | gzip | 使用 gzip 压缩归档文件（需要与-c或-x一起使用）。 |
| c | Create | 用于创建新的归档文件。 |
| f | Fire | 指定归档/提取文件的名称。 |
| x | Extract | 用于从归档文件中提取文件。 |
| t | List | 使用tf列出归档文件中包含的文件和目录。 |
| v | Verbose | 启用详细模式观察压/接压缩过程进度。 |

### gzip

```
gzip [文件] #压缩 后面可以跟多个文件 但是无法像tar一样压缩成一个文件 gzip会一个文件打一个压缩包
gzip -u [文件] #解压
```

> 在命名时gzip一般使用`文件名.gz`

### zip

```
zip -r [压缩包名] [文件] #压缩 后面可以跟多个文件压缩成一个文件
unzip [压缩包名] #将文件直接解压到与压缩包同级位置
```

### 关于rar

由于rar是windows上常用的压缩格式在Linux上较难解压，需要安装额外的工具。

[https://www.linuxprobe.com/lqsjyrwjzwsy.html](https://www.linuxprobe.com/lqsjyrwjzwsy.html)

## 六、文件传输

### 网站下载文件

```
curl -o [本地路径] [文件网址]
wget [文件网址]
```

注意 wget虽然好用但是不是Linux系统自带的文件下载工具需要自行安装

```
yum install -y wget
```

### 与其他操作系统直接上传下载

> 在Windows 10及更高版本中，内置了SSH客户端，允许你使用`scp`指令来从远程服务器下载文件。然而，要被动地接收文件，需要远程服务器上运行SSH服务器服务。对于其他类Unix系统（如Linux和macOS），同样需要运行SSH服务器以接收文件。
> 
>  简而言之，无论是在Windows 10还是其他类Unix系统上，使用`scp`指令下载文件是可行的，但要被动地接收文件，需要确保远程服务器上已启用SSH服务器服务，因为SSH服务器服务是接收文件的关键。

```
scp [文件路径] [用户名@主机地址]:/[文件被上传的位置] #文件上传
scp [用户名@主机地址]:/[文件位置] [文件路径] #文件下载

scp ./test.txt root@192.168.0.1:/home #文件上传
scp root@192.168.0.1:/home . #文件下载
```

### 使用rz sz

> `rz`和`sz`是一对用于在串口连接或SSH终端中进行文件传输的命令行工具，通常用于从本地计算机发送文件到远程计算机或从远程计算机接收文件。
> 
>  这两个命令通常与终端仿真软件（如Minicom、PuTTY、xshell等）一起使用，用于在计算机和嵌入式系统之间进行文件传输。

linux默认是不带这两个工具需要自行安装

```
yum install lrzsz -y
```

```
#上传 直接将文件拖入到模拟终端(xshell)即可完成上传操作
#下载
sz [要下载的文件] #使用模拟终端可以打开选择保存位置的GUI完成下载
```

极大程度上方便了本地计算机与远程计算机之间文件传输过程 如果还是觉得麻烦那么[Xftp](https://www.xshell.com/zh/xftp-download/)
将是终极解决方案。

## 七、软件安装

### 编译安装

以安装[nginx](https://nginx.org/en/download.html)
为例子

```
# 首先第一步去官网下载nginx的源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 下载到本地后解压
tar -zxf nginx-1.24.0.tar.gz
# cd到nginx-1.24.0
cd nginx-1.24.0
# 执行编译配置脚本并且使用指定安装目录参数
./configure --prefix=/usr/local/nginx
# 执行完成编译配置脚本后会多出Makefile文件 使用make就可读取Makefile文件中的信息进行编译
make
# 此时我们的程序已经编译完成 编译后内容在ojbs文件夹中 使用make install指令复制到指定好的目录中去
make install
# 最后进入/usr/local/nginx/sbin文件夹中 启动nginx
./nginx
# 如果发现在浏览器中无法访问服务器的ip 需要将防火墙关闭
systemctl stop firewalld
systemctl disable firewalld
```

> "configure" 文件通常是一个由软件开发者提供的脚本，用于配置和准备软件在特定系统上编译和运行。这个脚本通常命名为 "configure"，但也可能具有不同的名称，例如 "configure.sh" 或 "configure.py"，具体取决于软件开发者的偏好。
> 
>  `make` 是一个命令行工具，用于执行 Makefile 中定义的构建任务。通过运行 `make` 命令，您可以自动化地执行编译、链接和其他构建任务，而无需手动输入编译器和链接器的命令。
> 
>  `make install` 是一个常见的命令，通常用于在使用 Makefile 构建的软件项目中安装已编译的程序或库文件到系统中。这个命令通常会执行以下操作：
> 
>  1. **复制文件**：将已编译的可执行文件、库文件或其他必要的文件复制到系统的指定位置。这通常是系统的标准二进制目录，例如 `/usr/bin` 或 `/usr/local/bin`（对于可执行文件）或 `/usr/lib` 或 `/usr/local/lib`（对于库文件）。
> 2. **设置权限**：确保复制的文件具有适当的文件权限，以便它们可以被系统中的其他用户访问和执行。
> 3. **创建符号链接**：在某些情况下，`make install` 也可能创建符号链接，将安装的文件链接到系统中的标准位置，以便用户可以方便地访问它们。

### rpm安装

一些 Linux 发行版厂商为了方便使用者，通常会在编译过程繁琐的情况下，将常用软件编译完成后打包，然后提供给用户下载。Red Hat 和 Debian 等发行版厂商都拥有自己的包管理工具，使用户能够轻松地安装和管理这些预编译的软件包。

redhat系打包出来的叫做rpm包，debina系打包出来的叫deb包。

```
# 手动安装rpm包示例：不需要编译安装、也不用yum安装。
# 安装wget
yum install wget -y
# 使用wget下载rpm包
wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/tree-1.6.0-
10.el7.x86_64.rpm
# 安装rpm包 #rpm -i是安装，vh是显示安装进度条的意思。
rpm -ivh tree-1.6.0-10.el7.x86_64.rpm 
# 卸载
rpm -e tree
# 升级
rpm -Uvh xxx.rpm
# 查看已安装的软件
rpm -qa|grep httpd
```

rpm安装软件个小问题：

```
比如：安装vim，会提示安装失败，需要各种依赖包，需要先去安装依赖包。
wget http://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/vimenhanced-7.4.629-7.el7.x86_64.rpm
rpm -ivh vim-enhanced-7.4.629-7.el7.x86_64.rpm
```

所以，用rpm安装软件不好解决依赖包的问题，所以出来了下面的yum安装方式，自动下载安装需要的 依赖包。以后都用yum来安装。

### yum安装

```
#自动解决rpm依赖
#yum安装扩展yum仓库
yum install epel-release -y
#yum安装nginx
yum install nginx -y
#yum移除nginx
yum remove nginx -y
#查看仓库rpm的数量
yum repolist
```

安装方法总结：

编译安装：优点： 自由定制 痛点：难度高，步骤繁琐

rpm安装：优点：安装简单 痛点：需要自己解决依赖，不支持定制

yum安装：优点：自动解决依赖，默认安装最新版 痛点：不支持定制

## 八、文件查找

文件查找，我们在windows用的比较多，系统自带的搜索方式、第三方搜索工具everything等。 linux上没有图形化界面，就要借助find指令来查了。

```
#文件查找
例子1：普通查询
find   /etc   -maxdepth 1  -type f  -name "pa*"
命令   目录...   查找深度     类型   文件名称包含  
# -type文件类型：f表示文件，不指定类型的话，文件和目录都会查找
# -maxdepth查找深度：目录层级的意思，不指定的话，就按照最大深度来查找
# "pa*"： *表示匹配任意pa开头的内容，*号还可以写在开头
```

## 九、进程管理

进程是计算机中正在执行的程序的实例，它拥有独立的内存空间和系统资源。

### 查看进程

```
ps -ef #显示当前系统上所有正在运行的进程的详细信息
```

`ps` 表示 "进程状态"（Process Status）命令，用于查看系统中的进程信息。

`-ef` 是 `ps` 命令的选项参数，具有以下含义：

- `-e` 选项用于显示所有进程，包括当前用户和其他用户的。
- `-f` 选项用于显示详细的进程信息，包括进程的PID（进程标识符）、PPID（父进程的PID）、CPU 使用率、内存使用量、启动时间等。

因此，运行 `ps -ef` 命令会列出系统中所有进程的详细信息，这对于系统管理和排查问题时非常有用。通常，`ps -ef` 结果会显示在终端上，以便用户查看和分析。

`ps -ef` 命令的输出结果包含多个字段，每个字段提供了关于系统中运行进程的详细信息。以下是常见的字段说明：

1. **UID**：这是进程所属的用户ID。它显示了哪个用户启动了进程。
2. **PID**：进程ID，是每个进程的唯一标识符。
3. **PPID**：父进程ID，表示启动当前进程的父进程的PID。
4. **C**：CPU 使用率的百分比。它表示进程在CPU上的占用情况。
5. **STIME**：进程的启动时间，通常以HH:MM（小时：分钟）格式显示。
6. **TTY**：终端类型。显示了与进程关联的终端，如果没有关联终端，则显示 "?"。
7. **TIME**：进程累计的CPU时间，通常以分钟:秒（MM:SS）格式显示。
8. **CMD**：命令行或进程的名称。这是启动进程时使用的命令，可以告诉您进程在做什么。 如果被`[]`包裹起来它也可能是是系统进程或内核进程。

### 结束进程

```
kill [PID] #结束进程
pkill [进程名称] #批量结束进程 慎用容易误伤

kill -9 [PID] #强制结束进程
pkill -9 [进程名称] #批量强制结束进程
```

> 当在网络安全检查中发现可疑的Shell登录时，需要终止与该Shell会话相关的进程以中断连接。通常情况下，SSH登录会话涉及SSH服务器（通常是sshd进程）启动一个子Shell进程来处理用户的命令。因此，如果要终止用户的Shell会话，必须终止其父进程，即sshd进程。
> 
>  要找到需要终止的sshd进程，可以查看进程的PPID（父进程ID）字段。但需要谨慎操作，因为终止sshd进程将中断所有通过SSH连接到服务器的会话，而不仅仅是可疑的会话。因此，在执行此操作之前，必须慎重考虑后果，并确保只终止真正可疑或不必要的会话，以避免不必要的服务中断。
> 
>  此外，为了执行此操作，通常需要具备足够的权限，通常需要以管理员或超级用户身份执行终止进程的命令。否则，可能无法终止关键的系统进程。
> 
>  在Unix和类Unix操作系统中，`kill` 命令用于终止或发送信号给进程。`-9` 是 `kill` 命令的一个选项参数，表示要发送的信号编号。具体地说，`-9` 对应的信号是SIGKILL。
> 
>  SIGKILL 是一种特殊的信号，它强制终止目标进程，无论该进程是否愿意终止。使用 `-9` 选项，你可以强制终止一个进程，即使它处于不响应或僵死状态。
> 
>  需要注意的是，虽然SIGKILL可以确保进程终止，但它也可能导致数据损坏或未完成的操作。因此，在使用 `-9` 选项之前，应该优先考虑发送其他信号，如SIGTERM(15)（软件终止信号），以便让进程有机会进行清理工作和资源释放。只有在其他信号无效或无法终止目标进程时，才使用SIGKILL。

## 十、计算机硬件信息

lscpu 查看cpu信息

free -h 查看内存信息

df -h 查看硬盘信息

top 类似于进程管理器

## 十一、定时任务

```
crontab -l #查看定时任务
crontab -e #编辑定时任务
```

## 编辑定时任务

在定时任务（通常在类Unix系统中使用）中，时间表达式是用来指定定时任务执行的时间和频率的一种方式。时间表达式通常由5字段组成，每个字段之间由空格分隔。在这5个字段中，"*" 是一个特殊的通配符，表示匹配所有可能的值。下面是这5个字段的含义：

1. 第一个字段：分（Minutes） – 取值范围为0到59，表示一小时内的分钟数。
2. 第二个字段：时（Hours） – 取值范围为0到23，表示一天内的小时数。
3. 第三个字段：日（Day of month） – 取值范围为1到31，表示一个月内的某一天。
4. 第四个字段：月（Month） – 取值范围为1到12，表示一年内的月份。
5. 第五个字段：星期（Day of week） – 取值范围为0到7，其中0和7通常都表示星期日，1表示星期一，以此类推，6表示星期六。

```
*   *   *   *   *   *   [cmd]
分   时   日   月   星
分 0-59
时   0-23
日 0-31
月 1-12
星 1-7
如果直接 * * * * * [cmd] 则是每一分钟执行一次
```

> 有的时候cmd指令无效 需要使用可执行程序的绝对路径执行。 `which`

## 十二、服务管理

服务程序通常指的是在计算机系统中运行的一种特殊类型的程序，其主要目的是为其他程序或用户提供特定的功能或服务。这些服务可以是网络服务、文件服务、打印服务、数据库服务等等。服务程序通常在后台运行，不需要用户交互，并且可以随时为其他程序或用户提供所需的服务。

以下是一些常见的服务程序类型：

1. **Web 服务器：** Web 服务器是用于托管网站和应用程序的服务程序，它接受来自客户端浏览器的请求，并向其发送网页内容或数据。
2. **文件服务器：** 文件服务器存储和管理文件，并允许用户或其他计算机通过网络访问这些文件。这有助于文件共享和协作。
3. **数据库服务器：** 数据库服务器用于存储、管理和提供数据库中的数据。其他应用程序可以通过数据库服务器与数据库交互。
4. **邮件服务器：** 邮件服务器负责接收、存储和传递电子邮件消息。它还提供用户电子邮件账户的管理功能。
5. **打印服务器：** 打印服务器允许多台计算机共享一台打印机。用户可以将打印任务发送到打印服务器，然后服务器将任务传递给打印机。
6. **DNS 服务器：** DNS（域名系统）服务器将域名转换为相应的 IP 地址，以便互联网上的设备可以相互通信。
7. **应用程序服务器：** 应用程序服务器运行特定的应用程序，为用户或其他程序提供功能和数据。例如，许多在线游戏使用应用程序服务器来处理游戏逻辑和多人游戏。
8. **虚拟专用网络（VPN）服务器：** VPN 服务器允许远程用户通过加密的连接访问公司或机构的内部网络。

这里以web服务 httpd举例

```
# 安装服务
yum install httpd -y
# 启动服务
systemctl start [服务名称]
# 停止服务
systemctl stop [服务名称]
# 服务开机自启动
systemctl enable [服务名称]
# 关闭服务自启动
systemctl disable [服务名称]
# 重启服务
systemctl restart [服务名称]
# 查看服务列表
systemctl list-unit-files
# 查看指定服务状态
systemctl status [服务名称]
```

## 其他常用指令

### 打印当前工作目录

`pwd`全称Print Working Directory 它用于打印当前工作目录

```
pwd
```

### 打印历史指令

```
history
```

### 生成序列号

`seq` 命令的全称是 "sequence"，它用于生成一个数字序列并将其输出到标准输出。

```
seq 起始值 结束值
```

### 查询是否开启selinux模式

```
sestatus
```

### 查询文件状态

```
stat index.html
```

### 查看文件类型

```
file [文件]
```

### 历史指令记录

```
history
```

在网安过程中,进攻方的在目标机上所有输入的指令都会被history所记录，所以这里涉及到一个擦除历史指令记录的操作。

使用`history -c`可以清除内存中的历史记录，但此时并没有完全清除，原因是在用户目录下有一个隐藏文件 `.bash_history` 需要将这个文件一同删除才能做到清楚历史指令痕迹的操作。

.bash_history默认会记录最近1000条指令可以通过`/etc/profile`进行修改

```
...

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi

HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000   #修改这行增加或减少记录条数
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

...
```

### 命令别名

```
alias # 查看当前系统中别名的指令
alias cxip='ip addr|grep -w "inet"' # 添加一个指令别名
unalias cxip # 去除别名
```

但是请注意使用指令添加的别名仅在当前shell生效 用户退出或者关闭则消失。想要永久添加别名需要修改 `/用户目录/.bashrc` 文件。

### 查看时间日期

```
date #查看时间信息
date +%F #查看日期
date +%T #查看时间
date +%F\ %T #查看时间加日期

date -s '20230923 7:00:00' #修改日期和时间
systemctl restart chronyd #请求网络时间同步到本地
```

### 查询可执行程序路径

```
which [程序名]
```

## vi文件编辑器

`vi` 是一款常用的文本编辑器，特别是在Unix和Linux系统中。

```
# 如果文件存在则进入常规模式 如果文件不存在则创建文件并且直接进入常规模式常规模式
vi [文件名]
```

当使用vi编辑器一共有三个模式，分别是 常规模式、编辑模式、命令模式。

### 常规模式

- 常规模式是 `vi` 的默认模式，你在打开文件后就处于这个模式。
- 在常规模式下，你可以执行各种操作，如移动光标、删除字符、查找文本等。
- 从常规模式进入其他模式的方式是按下特定的键：
  - `i` 进入编辑模式，允许你插入文本（在光标前插入）。
  - `a` 进入编辑模式，允许你插入文本（在光标后插入）。
  - `o` 进入编辑模式，允许你插入文本（新起一行）。
  - `:` 进入命令模式，允许你执行高级命令。

### 编辑模式

- 编辑模式用于实际编辑文本内容，你可以输入或编辑文本。
- 要从常规模式进入编辑模式，按下 `i` 键（在光标前插入）或 `o` 键（在光标后插入）。
- 要返回常规模式，按下 `Esc` 键。

### 命令模式

- 命令模式用于执行高级命令，如保存文件、退出编辑器等。
- 要从常规模式进入命令模式，按下 `:` 键。
- 要返回常规模式，也是按下 `Esc` 键。

这三个模式之间的切换允许你在编辑文本时执行各种操作，从简单的文本导航和编辑到高级命令执行。你可以在这些模式之间灵活切换以满足不同的编辑需求。

### 常规模式下快捷键

| 快捷键 | 作用 |
| --- | --- |
| h | 向左移动一个字符 |
| j | 向下移动一行 |
| k | 向上移动一行 |
| l | 向右移动一个字符 |
| w | 向前移动一个单词 |
| b | 向后移动一个单词 |
| 0 (数字0) | 移到行首 |
| $ | 移到行尾 |
| G | 移到文件末尾 |
| gg | 移到文件开头 |
| x | 删除光标处的字符 |
| dd | 删除当前行 |
| yy | 复制当前行 |
| p | 粘贴剪贴板中的文本 |
| u | 撤销上一步操作 |
| / | 查找文本，然后按回车键查找下一个匹配项 |
| ? | 反向查找文本，然后按回车键查找上一个匹配项 |
| n | 在查找模式下，继续查找下一个匹配项 |
| N | 在查找模式下，继续查找上一个匹配项 |
| 数字 gg | 快速跳转到所输入数字的那一行 |
| : | 进入命令模式 |

### 常用命令

| 命令 | 作用 |
| --- | --- |
| :q | 退出编辑器 |
| :wq | 保存并退出编辑器 |
| :! | 强制模式 例如强制保存:!wq 强制退出!q |
| :set number | 标注行号 |

## 特殊符号

### 管道符 |

在 Linux 中，管道符 `|` 是一个强大的工具，用于将命令的输出传递给另一个命令的输入。它的作用是将多个命令串联在一起，让它们协同工作，以便处理和转换数据流。理解 Linux 管道符的关键点包括以下几个方面：

1. **命令连接**：管道符 `|` 允许你将一个命令的输出连接到另一个命令的输入。这意味着第一个命令的输出将成为第二个命令的输入。
2. **数据流动**：通过管道，数据可以在多个命令之间自由流动。这样，你可以将一个命令的输出作为另一个命令的输入，从而在命令之间传递和处理数据。
3. **实例**：以下是一个简单的示例，说明如何使用管道来处理数据。假设你有一个包含文本的文件 `data.txt`，你可以使用以下命令来查找其中包含特定关键词的行并对其进行排序： ``` cat data.txt | grep "关键词" | sort ``` 这个命令首先使用 `cat` 命令显示文件内容，然后将其输出通过管道传递给 `grep` 命令，以查找包含关键词的行，最后将 `grep` 的输出通过管道传递给 `sort` 命令，以对结果进行排序。
4. **数据处理**：管道允许你使用多个命令来处理和转换数据。你可以将多个命令组合在一起，以便进行筛选、排序、计数、格式化等各种操作。
5. **灵活性**：管道是 Linux 系统中的强大工具，使你能够以不同的方式组合命令来执行各种任务。它提供了很大的灵活性，允许你根据需要创建复杂的数据处理流程。

总之，Linux 管道符 `|` 是一个强大的工具，用于将命令串联在一起，以便处理和转换数据流。通过合理使用管道，你可以在 Linux 系统上高效地执行各种数据处理任务。

### 调用历史指令 !

在Linux命令行中，`!`符号通常用于执行历史命令的扩展和引用。具体来说，`!`后面可以跟随不同的操作，以便执行以前使用过的命令。以下是一些常见用法和作用：

1. **执行上一条命令**：使用`!!`可以快速执行上一条命令，而不必重新输入它。例如： ``` $ ls -l $ !! # 等同于使用ls -l ``` 上面的`!!`将再次执行`ls -l`命令。
2. **执行带有特定前缀的命令**：你可以使用`!`后面跟随特定前缀来执行最后一个以该前缀开头的命令。例如，如果你之前运行了多个`grep`命令，可以使用`!grep`来执行最后一个`grep`命令。
3. **执行历史中的特定命令**：使用`!`后面可以跟随一个数字，来执行历史中对应位置的命令。例如，`!5`将执行历史中的第五个命令。
4. **执行包含特定字符串的命令**：你可以使用`!`后面跟随一个字符串，以执行包含该字符串的最后一个命令。例如，如果你之前运行了多个命令包含了单词"error"，你可以使用`!error`来执行最后一个包含"error"的命令。

### 输出重定向 >

输出重定向是一种将命令的标准输出（通常是显示在终端上的结果）重定向到文件或另一个设备的过程。这允许你将命令的输出保存到文件中，而不是在屏幕上显示它，或者将输出发送到另一个命令或设备中。

```
ip addr>ip.txt #将ip addr的标准输出保存到ip.txt中
```

! 不过需要格外注意的是，输出重定向符号会完全覆盖原本文件中的内容。想要保留原本文件内容需要使用 `>>` 将ip输出追加到文件中。

```
ip addr>>ip.txt #将ip addr的标准输出追加保存到ip.txt中
```

也可以在输出重定向左侧什么也不输入达到清空文件内容的效果

```
>ip.txt
```

#### 标准错误输出

如果指令执行错误，可以将错误的结果输出到文件中。

```
ip abbr 1>ip.txt 2>error.txt # 如果指令执行正确将结果保存在ip.txt中 错误则保存在error.txt中
ip abbr 1>>ip.txt 2>>error.txt # 同样可以使用追加重定向符号
```

### 输入重定向 <

在Linux中，输入重定向是一种将命令的输入从键盘或标准输入设备重定向到文件或另一个命令的过程。这允许你从文件中读取数据，而不是手动输入，或者将一个命令的输出作为另一个命令的输入。

```
head -10 < xiaoshuo.txt #将小说的内容交给head处理 因为head有-10参数所以只会输出小说的前10行
```

#### 追加输入

```
head -3 << 0 #可以输入多行内容直到碰到0按下回车结束
```

## 注释

用于注释指令 #号后面内容不执行

## 命令分割 ;

用于一次性多次执行指令

```
ls;ps -ef #先执行ls 后执行ps 可以衔接更多
```

## 系统优化

现在的操作系统需要优化的地方不多了，甚至直接就可以使用，之前的老系统都需要好多优化才行。

```
#1.优化ssh，以防连接过慢
vi /etc/ssh/sshd_config  # 改配置文件之前，最好先做好备份，cp /etc/ssh/sshd_config
/etc/ssh/sshd_config.bak
#79行：GSSAPIAuthentication no
#115行：UseDNS no  # 别忘了删除前面的注释符号#
systemctl restart sshd

2.优化selinux
#修改配置文件，永久关闭
vi /etc/selinux/config
#第7行修改为
SELINUX=disabled
#需要重启生效
#立即生效，临时的 #有时候有些服务器不让重启，就可以先这样临时用一下
setenforce 0

#3.关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

#4.安装常用软件
yum install lrzsz vim tree wget net-tools screen bash-completion tcpdump -y
```

```
# net-tools：网络相关工具，比如ifconfig、ifconfig ens33(只看某个网卡的ip)，rpm -qa是查看
安装了哪些rpm包，具体这个软件有哪些命令，可以通过rpm -ql net-tools来查看。
# screen：屏幕工具。
# 我们以后可能要远程连接某个服务器，比如服务器在国外，那么我们通过本地xshell等远程连接到目
标服务器，那么中间有要经过很多个网络设备的传输，很容易断掉连接，如果我们正在执行某个程序，突然断
开连接了，那么我们执行的程序也会自动中断，如果我们不想让程序终端，就可以用到screen命令了。
   [root@localhost ~]# screen # 会单独再给我们开启一个终端
   [root@localhost ~]# sleep 100
# 然后模拟一下，断开连接，在重新连接回来，还可以通过screen恢复到之前的窗口状态，发现程序还
在继续执行着。
   [root@localhost ~]# screen -ls
   There is a screen on:
        16389.pts-1.localhost (Detached)
    1 Socket in /var/run/screen/S-root.
   [root@localhost ~]# screen -r 16389 # 恢复窗口
# 所以当网络不稳定的时候最好用screen来操作。
# bash-completion：这个软件很神奇，叫做超级自动补全。这个包安装完之后，要重新登录一下才行。
# 这个工具是tab键的加强版，输入-然后再使用tab的时候可以提示我们有哪些参数了，也就是提示信息更全
了。
[root@localhost ~]# find /etc/ -size 10k -
-amin                   -ignore_readdir_race    -path
-anewer                 -ilname                 -perm
-atime                  -iname                  -print
# 再比如我们想下载某个软件，我记得好像是psm，然后一个tab键就自动补全包名了
```
