> ## Content Index
> Fetch the complete content index at: https://blog.vercanti.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Linux 入门完全指南
- URL: https://blog.vercanti.com/linux-ru-men-wan-quan-zhi-nan/
- Published: 2026-08-28T14:34:27.000Z
- Updated: 2026-08-28T14:56:33.000Z
- Description: Linux 是一个开源的操作系统内核，由 Linus Torvalds 于 1991 年创建。我们日常说的"Linux"通常指以 Linux 内核为基础的各种发行版。 常见发行版对比 ls -l 输出解读 ls 常用参数表 mkdir 参数表 rm 参数表 cp 参数表 less 内部操作 find 常用参数表 grep 常用参数表 awk 常用变量 权限数字对应 常用权限：755（所有者全权，其他只读执行）、644（所有者读写，其他只读）、600（私密文件） chmod 符号参数 useradd 参数表 ps aux 输出字段 top 内部操作 常用信
- Author: yellowdog
- Tags: Linux

> 官方文档：<https://www.kernel.org/doc/html/latest/> | <https://man7.org/linux/man-pages/>  
> 最后更新：2026-03-05

---

## 一、Linux 基础概念

### Linux 是什么

Linux 是一个开源的操作系统内核，由 Linus Torvalds 于 1991 年创建。我们日常说的"Linux"通常指以 Linux 内核为基础的各种发行版。

**常见发行版对比**

| 发行版              | 包管理器    | 适用场景     | 特点              |
| ---------------- | ------- | -------- | --------------- |
| Ubuntu           | apt     | 个人桌面、服务器 | 社区庞大，新手友好       |
| Debian           | apt     | 服务器      | 极其稳定，Ubuntu 的上游 |
| CentOS/AlmaLinux | yum/dnf | 企业服务器    | 与 RHEL 兼容       |
| Fedora           | dnf     | 开发者桌面    | 新技术先行           |
| Arch Linux       | pacman  | 进阶用户     | 滚动更新，极简主义       |

### 终端、Shell、Bash

- **终端（Terminal）**：输入命令的窗口界面，如 gnome-terminal、iTerm2
- **Shell**：解释并执行命令的程序，终端里运行的就是 Shell
- **Bash**：最常见的 Shell，全称 Bourne Again Shell
- **命令格式**：`command [选项] [参数]`，选项通常以 `-` 或 `--` 开头

```bash
ls -la /home        # ls 是命令，-la 是选项，/home 是参数
ls --all --human-readable /home   # 长选项写法（与上等价）

```

### 目录结构

```
/                   根目录，一切的起点
├── bin/            基础命令（ls、cp、mv 等）
├── sbin/           系统管理命令（需要 root）
├── etc/            配置文件
├── home/           普通用户主目录（每人一个子目录）
├── root/           root 用户的主目录
├── var/            可变数据（日志、缓存、数据库）
├── tmp/            临时文件，重启后清除
├── usr/            用户程序（/usr/bin、/usr/lib）
├── opt/            第三方软件
├── proc/           虚拟文件系统，内核/进程信息
├── dev/            设备文件
├── lib/            库文件
└── mnt/ 和 media/  挂载点

```

### 路径

```bash
/home/alice/docs/report.txt   # 绝对路径：从根目录 / 开始
../images/photo.jpg           # 相对路径：.. 表示上一级目录
./script.sh                   # ./ 表示当前目录
~/Downloads                   # ~ 表示当前用户主目录（/home/用户名）

```

---

## 二、文件与目录操作

### pwd — 显示当前目录

```bash
pwd
# 输出：/home/alice/projects

```

### ls — 列出目录内容

```bash
ls              # 列出当前目录
ls /etc         # 列出指定目录
ls -l           # 长格式（显示权限、大小、时间）
ls -a           # 显示隐藏文件（以 . 开头的文件）
ls -la          # 组合：长格式 + 隐藏文件
ls -lh          # 人类可读的文件大小（KB/MB/GB）
ls -lt          # 按修改时间排序（最新在前）
ls -lS          # 按文件大小排序（最大在前）
ls -R           # 递归列出所有子目录

```

**ls -l 输出解读**

```
-rw-r--r-- 1 alice alice 4096 Mar 5 10:30 file.txt
│ │  │  │  │  │     │    │    │           └── 文件名
│ │  │  │  │  │     │    │    └──────────── 修改时间
│ │  │  │  │  │     │    └───────────────── 文件大小（字节）
│ │  │  │  │  │     └────────────────────── 所属组
│ │  │  │  │  └──────────────────────────── 所有者
│ │  │  │  └─────────────────────────────── 硬链接数
│ │  │  └────────────────────────────────── 其他用户权限 (r--)
│ │  └───────────────────────────────────── 组权限 (r--)
│ └──────────────────────────────────────── 所有者权限 (rw-)
└────────────────────────────────────────── 文件类型（- 普通文件，d 目录，l 链接）

```

**ls 常用参数表**

| 参数  | 说明                |
| --- | ----------------- |
| \-l | 长格式显示             |
| \-a | 显示隐藏文件（含 . 和 ..）  |
| \-A | 显示隐藏文件（不含 . 和 ..） |
| \-h | 人类可读的大小（配合 -l 使用） |
| \-t | 按修改时间排序           |
| \-S | 按文件大小排序           |
| \-r | 反向排序              |
| \-R | 递归列出子目录           |

### cd — 切换目录

```bash
cd /etc             # 切换到绝对路径
cd Documents        # 切换到当前目录下的 Documents
cd ..               # 返回上一级目录
cd ../..            # 返回上两级
cd ~                # 回到主目录
cd -                # 返回上一次所在目录（很实用）

```

### mkdir — 创建目录

```bash
mkdir projects                  # 创建单个目录
mkdir -p a/b/c                  # 递归创建（父目录不存在时自动创建）
mkdir -m 755 public_dir         # 创建时指定权限
mkdir dir1 dir2 dir3            # 同时创建多个目录

```

**mkdir 参数表**

| 参数       | 说明                       |
| -------- | ------------------------ |
| \-p      | 递归创建，父目录不存在时自动创建，已存在时不报错 |
| \-m mode | 指定目录权限（如 755）            |
| \-v      | 显示创建过程                   |

### rm — 删除文件和目录

> **警告**：`rm` 删除的文件不进回收站，无法恢复。使用 `-rf` 时务必确认路径！

```bash
rm file.txt             # 删除文件
rm -i file.txt          # 删除前询问确认（推荐新手使用）
rm -f file.txt          # 强制删除，不询问
rm -r mydir/            # 递归删除目录及其内容
rm -rf mydir/           # 强制递归删除（危险！）
rm *.log                # 删除所有 .log 文件

```

**rm 参数表**

| 参数  | 说明                |
| --- | ----------------- |
| \-r | 递归删除目录            |
| \-f | 强制删除，忽略不存在的文件，不询问 |
| \-i | 每次删除前询问           |
| \-v | 显示删除过程            |

### cp — 复制

```bash
cp file.txt backup.txt              # 复制文件
cp -r mydir/ backup/                # 递归复制目录
cp -p file.txt backup.txt           # 保留原文件属性（时间、权限）
cp -n file.txt dest/                # 不覆盖已存在文件
cp -i file.txt dest/                # 覆盖前询问
cp -v file.txt dest/                # 显示复制过程
cp file1.txt file2.txt /tmp/        # 复制多个文件到目录

```

**cp 参数表**

| 参数  | 说明                 |
| --- | ------------------ |
| \-r | 递归复制目录             |
| \-p | 保留文件属性（时间戳、权限、所有者） |
| \-n | 不覆盖已存在文件           |
| \-i | 覆盖前询问              |
| \-v | 显示复制过程             |
| \-u | 仅在源文件比目标更新时才复制     |

### mv — 移动/重命名

```bash
mv old.txt new.txt              # 重命名
mv file.txt /tmp/               # 移动到目录
mv dir1/ /opt/dir2              # 移动并重命名目录
mv -i file.txt dest/            # 覆盖前询问
mv -n file.txt dest/            # 不覆盖已存在文件

```

### touch — 创建空文件 / 更新时间戳

```bash
touch newfile.txt               # 创建空文件（若已存在则更新时间戳）
touch file1.txt file2.txt       # 同时创建多个

```

### stat — 查看文件详细信息

```bash
stat file.txt
# 输出：文件大小、块数、inode号、权限、硬链接数、所有者、访问/修改/变更时间

```

---

## 三、查看文件内容

### cat — 输出文件内容

```bash
cat file.txt                # 输出全部内容
cat -n file.txt             # 显示行号
cat file1.txt file2.txt     # 拼接输出多个文件
cat -A file.txt             # 显示特殊字符（$ 表示换行，^I 表示制表符）

```

### less — 分页查看（推荐）

```bash
less file.txt

```

**less 内部操作**

| 按键       | 说明      |
| -------- | ------- |
| 空格 / f   | 向下翻一页   |
| b        | 向上翻一页   |
| j / 下箭头  | 向下一行    |
| k / 上箭头  | 向上一行    |
| g        | 跳到文件开头  |
| G        | 跳到文件末尾  |
| /pattern | 向下搜索    |
| ?pattern | 向上搜索    |
| n        | 下一个搜索结果 |
| N        | 上一个搜索结果 |
| q        | 退出      |

### head / tail — 查看头尾

```bash
head file.txt               # 显示前 10 行（默认）
head -n 20 file.txt         # 显示前 20 行
tail file.txt               # 显示最后 10 行
tail -n 50 file.txt         # 显示最后 50 行
tail -f /var/log/syslog     # 实时追踪文件末尾（监控日志）
tail -F logfile             # 同上，文件不存在时也等待

```

### wc — 统计行数/字数/字节数

```bash
wc file.txt                 # 输出：行数 单词数 字节数 文件名
wc -l file.txt              # 只统计行数
wc -w file.txt              # 只统计单词数
wc -c file.txt              # 只统计字节数
wc -l *.py                  # 统计所有 .py 文件行数

```

---

## 四、文件搜索

### find — 按条件搜索文件

```bash
find /home -name "*.txt"                    # 按名称搜索
find . -name "*.py" -type f                 # 只找文件（不含目录）
find /etc -type d                           # 只找目录
find . -size +10M                           # 大于 10MB 的文件
find . -size -1k                            # 小于 1KB 的文件
find . -mtime -7                            # 7天内修改过的文件
find . -mtime +30                           # 30天前修改的文件
find . -name "*.log" -delete                # 找到后直接删除
find . -name "*.sh" -exec chmod +x {} \;   # 找到后执行命令
find . -maxdepth 2 -name "*.md"            # 限制搜索深度为 2 层
find . -empty                               # 找空文件/空目录
find /var/log -name "*.log" -size +100M    # 大于 100MB 的日志

```

**find 常用参数表**

| 参数                | 说明                            | 示例               |
| ----------------- | ----------------------------- | ---------------- |
| \-name            | 按文件名（支持通配符 \* ?）              | \-name "\*.txt"  |
| \-iname           | 同上，忽略大小写                      | \-iname "\*.TXT" |
| \-type            | 文件类型（f 普通文件，d 目录，l 链接）        | \-type f         |
| \-size            | 按大小（+ 大于，\- 小于，k/M/G 单位）      | \-size +10M      |
| \-mtime           | 按修改时间（天），\-n 为 n 天内，+n 为 n 天前 | \-mtime -7       |
| \-maxdepth        | 限制目录搜索深度                      | \-maxdepth 3     |
| \-exec cmd {} \\; | 对每个结果执行命令，{} 代表当前文件           | \-exec rm {} \\; |
| \-delete          | 删除找到的文件                       | \-delete         |
| \-empty           | 找空文件或空目录                      | \-empty          |

### grep — 文本搜索

```bash
grep "error" app.log                    # 在文件中搜索
grep -i "error" app.log                 # 忽略大小写
grep -r "TODO" ./src/                   # 递归搜索目录
grep -n "error" app.log                 # 显示行号
grep -l "error" *.log                   # 只显示匹配的文件名
grep -v "debug" app.log                 # 反向匹配（不含 debug 的行）
grep -E "error|warning" app.log         # 正则匹配
grep -c "error" app.log                 # 统计匹配行数
grep -A 3 "error" app.log              # 匹配行及其后 3 行
grep -B 2 "error" app.log              # 匹配行及其前 2 行
grep -C 2 "error" app.log              # 匹配行及其前后各 2 行
grep "^#" config.conf                   # 以 # 开头的行
grep "\.py$" filelist.txt               # 以 .py 结尾的行

```

**grep 常用参数表**

| 参数        | 说明             |
| --------- | -------------- |
| \-i       | 忽略大小写          |
| \-r / \-R | 递归搜索目录         |
| \-n       | 显示行号           |
| \-l       | 只输出含匹配的文件名     |
| \-L       | 只输出不含匹配的文件名    |
| \-v       | 反向匹配           |
| \-c       | 统计匹配行数         |
| \-E       | 使用扩展正则表达式（ERE） |
| \-F       | 当作固定字符串，不解析正则  |
| \-w       | 全词匹配           |
| \-A n     | 显示匹配行之后 n 行    |
| \-B n     | 显示匹配行之前 n 行    |
| \-C n     | 显示匹配行前后各 n 行   |

### which / whereis / type

```bash
which python3               # 查找命令的可执行文件路径
whereis ls                  # 查找命令的二进制、源码、手册位置
type ls                     # 判断命令类型（内置/外部/别名）

```

---

## 五、文本处理

### 管道与重定向

```bash
# 重定向
ls > files.txt              # 将输出写入文件（覆盖）
ls >> files.txt             # 追加到文件末尾
cat < input.txt             # 从文件读取输入
command 2> error.log        # 将错误输出写入文件
command 2>&1 > all.log      # 标准输出和错误都写入文件
command > /dev/null 2>&1    # 丢弃所有输出

# 管道：将前一个命令的输出作为后一个命令的输入
ls -l | grep ".txt"         # 只列出 .txt 文件
cat file.txt | sort | uniq  # 排序后去重
ps aux | grep python        # 找包含 python 的进程

```

### sort — 排序

```bash
sort file.txt               # 按字母升序排序
sort -n numbers.txt         # 按数字排序
sort -r file.txt            # 倒序
sort -k 2 data.txt          # 按第 2 列排序
sort -u file.txt            # 排序并去重
sort -t ',' -k 2 data.csv   # 指定分隔符，按第 2 字段排序

```

### uniq — 去重

```bash
uniq file.txt               # 去除相邻重复行（通常先 sort）
sort file.txt | uniq        # 去重
sort file.txt | uniq -c     # 统计每行出现次数
sort file.txt | uniq -d     # 只显示重复行
sort file.txt | uniq -u     # 只显示不重复行

```

### cut — 提取字段

```bash
cut -d ',' -f 1 data.csv        # 逗号分隔，取第1列
cut -d ':' -f 1,3 /etc/passwd   # 冒号分隔，取第1和第3列
cut -c 1-10 file.txt            # 取每行第1到10个字符

```

### awk — 文本处理利器

```bash
# 基本结构：awk 'BEGIN{...} pattern{action} END{...}' file
awk '{print $1}' file.txt           # 打印第1列（空格分隔）
awk -F ',' '{print $2}' data.csv   # 逗号分隔，打印第2列
awk '{print NR, $0}' file.txt      # 打印行号和全行内容
awk 'NR==5' file.txt               # 打印第5行
awk '$3 > 100' data.txt            # 打印第3列大于100的行
awk '{sum += $1} END{print sum}' nums.txt  # 对第1列求和
awk -F ':' '{print $1, $3}' /etc/passwd   # 打印用户名和UID
awk '/error/{print NR, $0}' app.log       # 打印含 error 的行及行号

```

**awk 常用变量**

| 变量        | 说明            |
| --------- | ------------- |
| $0        | 整行内容          |
| $1 $2 ... | 第 1、2... 列    |
| NR        | 当前行号          |
| NF        | 当前行的列数        |
| FS        | 输入字段分隔符（默认空格） |
| OFS       | 输出字段分隔符       |
| RS        | 输入记录分隔符（默认换行） |

### sed — 流编辑器

```bash
sed 's/old/new/' file.txt           # 替换每行第1处匹配
sed 's/old/new/g' file.txt          # 替换所有匹配（全局）
sed 's/old/new/gi' file.txt         # 不区分大小写替换
sed -i 's/old/new/g' file.txt       # 直接修改文件（-i 原地编辑）
sed -i.bak 's/old/new/g' file.txt   # 修改前备份为 .bak
sed '3d' file.txt                   # 删除第3行
sed '/pattern/d' file.txt           # 删除匹配行
sed -n '5,10p' file.txt             # 只打印第5到10行
sed '2i\插入的文字' file.txt         # 在第2行前插入
sed '2a\追加的文字' file.txt         # 在第2行后追加

```

---

## 六、权限管理

### 权限格式解读

```
-rwxr-xr--  1  alice  developers  4096  Mar 5  script.sh
 │││ │││ │││
 │││ │││ └┤└── 其他用户（others）：r--（只读）
 │││ └┤┘      组（group）：r-x（读+执行）
 └┤┘          所有者（owner）：rwx（读+写+执行）
  └────────── 文件类型：- 普通文件  d 目录  l 软链接

```

**权限数字对应**

| 数字 | 权限   | 二进制 |
| -- | ---- | --- |
| 7  | rwx  | 111 |
| 6  | rw-  | 110 |
| 5  | r-x  | 101 |
| 4  | r--  | 100 |
| 0  | \--- | 000 |

常用权限：`755`（所有者全权，其他只读执行）、`644`（所有者读写，其他只读）、`600`（私密文件）

### chmod — 修改权限

```bash
chmod 755 script.sh             # 数字模式
chmod 644 config.txt            # 所有者rw，其他r
chmod +x script.sh              # 给所有人添加执行权限
chmod u+x script.sh             # 只给所有者添加执行权限
chmod go-w file.txt             # 移除组和其他人的写权限
chmod -R 755 mydir/             # 递归修改目录及其内容
chmod a=rw file.txt             # 设置所有人为 rw

```

**chmod 符号参数**

| 符号 | 说明           |
| -- | ------------ |
| u  | 所有者（user）    |
| g  | 所属组（group）   |
| o  | 其他用户（others） |
| a  | 所有人（all）     |
| +  | 添加权限         |
| \- | 移除权限         |
| \= | 设置为指定权限      |

### chown — 修改所有者

```bash
chown alice file.txt                # 修改所有者
chown alice:developers file.txt     # 修改所有者和所属组
chown :developers file.txt          # 只修改所属组
chown -R alice:alice mydir/         # 递归修改目录

```

### sudo 与 su

```bash
sudo command                    # 以 root 权限执行单条命令
sudo -i                         # 切换到 root shell
sudo -u alice command           # 以 alice 身份执行
su alice                        # 切换到 alice 用户（需要其密码）
su -                            # 切换到 root（需要 root 密码）

```

---

## 七、用户与组管理

```bash
# 查看当前用户信息
whoami                          # 显示当前用户名
id                              # 显示 uid、gid、所属组
id alice                        # 查看 alice 的信息
who                             # 当前登录的所有用户
w                               # 更详细的登录用户信息

# 用户管理
sudo useradd -m alice           # 创建用户（-m 同时创建主目录）
sudo useradd -m -s /bin/bash -G sudo alice  # 完整创建，指定shell和附加组
sudo passwd alice               # 设置用户密码
sudo usermod -aG docker alice   # 将 alice 加入 docker 组（-a 追加，不能省略）
sudo userdel alice              # 删除用户
sudo userdel -r alice           # 删除用户及其主目录

# 组管理
sudo groupadd developers        # 创建组
sudo groupdel developers        # 删除组
groups alice                    # 查看 alice 所属的组

```

**useradd 参数表**

| 参数          | 说明                      |
| ----------- | ----------------------- |
| \-m         | 创建主目录                   |
| \-s shell   | 指定登录 shell（如 /bin/bash） |
| \-g group   | 指定主组                    |
| \-G groups  | 指定附加组（逗号分隔）             |
| \-d dir     | 指定主目录路径                 |
| \-c comment | 注释（通常是全名）               |

---

## 八、进程管理

### ps — 查看进程

```bash
ps aux                  # 显示所有进程（最常用）
ps -ef                  # 显示所有进程（另一种格式）
ps aux | grep python    # 查找 python 相关进程
ps -p 1234              # 查看指定 PID 的进程

```

**ps aux 输出字段**

| 字段      | 说明                      |
| ------- | ----------------------- |
| USER    | 进程所有者                   |
| PID     | 进程 ID                   |
| %CPU    | CPU 使用率                 |
| %MEM    | 内存使用率                   |
| VSZ     | 虚拟内存（KB）                |
| RSS     | 物理内存（KB）                |
| TTY     | 终端                      |
| STAT    | 进程状态（R运行 S睡眠 Z僵尸 D不可中断） |
| START   | 启动时间                    |
| TIME    | CPU 累计时间                |
| COMMAND | 命令                      |

### top — 实时进程监控

```bash
top                     # 启动 top

```

**top 内部操作**

| 按键 | 说明           |
| -- | ------------ |
| q  | 退出           |
| k  | 杀死进程（输入 PID） |
| P  | 按 CPU 排序     |
| M  | 按内存排序        |
| 1  | 显示每个 CPU 核心  |
| u  | 过滤指定用户       |
| h  | 帮助           |

### kill — 发送信号

```bash
kill 1234               # 发送 SIGTERM（15）请求进程退出
kill -9 1234            # 发送 SIGKILL（9）强制杀死（无法忽略）
kill -15 1234           # 等价于 kill 1234
pkill python            # 按名称杀进程
pkill -u alice          # 杀死 alice 的所有进程
killall firefox         # 杀死所有名为 firefox 的进程

```

**常用信号**

| 信号      | 数字 | 说明                  |
| ------- | -- | ------------------- |
| SIGTERM | 15 | 请求终止（可被捕获，进程可清理后退出） |
| SIGKILL | 9  | 强制终止（不可忽略，立即停止）     |
| SIGHUP  | 1  | 挂起，常用于重新加载配置        |
| SIGINT  | 2  | 中断（等同于 Ctrl+C）      |

### 后台运行

```bash
command &               # 后台运行
nohup command &         # 后台运行，退出终端后继续执行，输出到 nohup.out
jobs                    # 查看当前终端的后台任务
fg %1                   # 将后台任务 1 调到前台
bg %1                   # 继续运行被暂停的后台任务
Ctrl+Z                  # 暂停前台任务（发送 SIGTSTP）

```

---

## 九、磁盘与存储

```bash
df -h                   # 查看磁盘使用情况（人类可读）
df -hT                  # 同上，显示文件系统类型
du -sh /var/log/        # 查看目录总大小
du -sh /var/log/*/      # 查看各子目录大小
du -h --max-depth=1 /   # 查看根目录下各目录大小
lsblk                   # 列出块设备（磁盘分区）

```

---

## 十、网络命令

### ping

```bash
ping google.com             # 持续发包（Ctrl+C 停止）
ping -c 4 google.com        # 发 4 个包后停止
ping -i 2 google.com        # 每 2 秒发一个包
ping -W 3 google.com        # 等待响应超时 3 秒

```

### curl — 发送 HTTP 请求

```bash
curl https://example.com                                # GET 请求
curl -o file.html https://example.com                   # 保存到文件
curl -L https://short.url                               # 跟随重定向
curl -s https://api.example.com/data                    # 静默模式（不显示进度）
curl -v https://example.com                             # 详细模式（含请求头）

# POST 请求
curl -X POST https://api.example.com/users \
     -H "Content-Type: application/json" \
     -d '{"name":"alice","age":25}'

# 带认证的请求
curl -H "Authorization: Bearer TOKEN" https://api.example.com/data

```

**curl 常用参数表**

| 参数                  | 说明                              |
| ------------------- | ------------------------------- |
| \-X method          | 指定 HTTP 方法（GET/POST/PUT/DELETE） |
| \-H "Header: Value" | 添加请求头                           |
| \-d "data"          | 请求体（自动使用 POST）                  |
| \-o file            | 输出保存到文件                         |
| \-O                 | 用 URL 文件名保存                     |
| \-L                 | 跟随重定向                           |
| \-s                 | 静默模式（不显示进度）                     |
| \-v                 | 详细输出（含请求/响应头）                   |
| \-u user:pass       | HTTP 认证                         |
| \-k                 | 忽略 SSL 证书错误                     |
| \-c cookies.txt     | 保存 Cookie                       |
| \-b cookies.txt     | 发送 Cookie                       |

### wget — 下载文件

```bash
wget https://example.com/file.zip                   # 下载文件
wget -O myfile.zip https://example.com/file.zip     # 指定文件名
wget -c https://example.com/file.zip                # 断点续传
wget -q https://example.com/file.zip                # 安静模式
wget -r -l 2 https://example.com                    # 递归下载（深度2）

```

### SSH — 远程登录

```bash
ssh user@192.168.1.100          # 连接远程服务器
ssh -p 2222 user@server.com     # 指定端口
ssh -i ~/.ssh/id_rsa user@host  # 指定私钥文件

# 生成 SSH 密钥对（免密登录）
ssh-keygen -t ed25519 -C "your@email.com"
# 将公钥上传到服务器
ssh-copy-id user@server.com

```

**\~/.ssh/config 配置（简化连接）**

```
Host myserver
    HostName 192.168.1.100
    User alice
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

```

```bash
ssh myserver        # 使用配置后简化连接

```

### scp — 远程复制

```bash
scp file.txt user@server:/tmp/              # 本地文件上传到服务器
scp user@server:/tmp/file.txt ./            # 从服务器下载文件
scp -r mydir/ user@server:/opt/             # 递归复制目录
scp -P 2222 file.txt user@server:/tmp/      # 指定端口

```

### 查看端口与连接

```bash
ss -tuln                    # 查看监听的 TCP/UDP 端口（推荐）
ss -tulnp                   # 同上，显示进程信息（需 root）
netstat -tuln               # 同上（较旧的命令）
ss -s                       # 连接统计摘要

```

---

## 十一、软件包管理

### apt（Ubuntu/Debian）

```bash
sudo apt update                         # 更新软件源索引
sudo apt upgrade                        # 升级所有可升级包
sudo apt full-upgrade                   # 升级（可移除旧包）
sudo apt install nginx                  # 安装软件
sudo apt install -y nginx               # 自动确认安装
sudo apt remove nginx                   # 卸载（保留配置）
sudo apt purge nginx                    # 卸载（含配置文件）
sudo apt autoremove                     # 清理不再需要的依赖
sudo apt search keyword                 # 搜索软件包
apt show nginx                          # 查看包信息
apt list --installed                    # 列出已安装的包

```

**apt 常用参数表**

| 子命令              | 说明         |
| ---------------- | ---------- |
| update           | 更新包列表（不安装） |
| upgrade          | 升级所有包      |
| install pkg      | 安装包        |
| remove pkg       | 卸载包（保留配置）  |
| purge pkg        | 完全卸载（含配置）  |
| autoremove       | 自动清理无用依赖   |
| search keyword   | 搜索包        |
| show pkg         | 显示包详细信息    |
| list --installed | 列出已安装包     |

### yum/dnf（CentOS/RHEL）

```bash
sudo dnf install nginx          # 安装
sudo dnf remove nginx           # 卸载
sudo dnf update                 # 升级所有包
sudo dnf search nginx           # 搜索
sudo dnf info nginx             # 包信息
sudo dnf list installed         # 已安装列表

```

---

## 十二、系统服务管理（systemctl）

```bash
sudo systemctl start nginx          # 启动服务
sudo systemctl stop nginx           # 停止服务
sudo systemctl restart nginx        # 重启服务
sudo systemctl reload nginx         # 重新加载配置（不中断服务）
sudo systemctl status nginx         # 查看服务状态
sudo systemctl enable nginx         # 设置开机自启
sudo systemctl disable nginx        # 取消开机自启
sudo systemctl is-active nginx      # 检查服务是否运行
systemctl list-units --type=service # 列出所有服务

```

**systemctl 参数表**

| 子命令        | 说明                         |
| ---------- | -------------------------- |
| start      | 启动服务                       |
| stop       | 停止服务                       |
| restart    | 停止后重新启动                    |
| reload     | 重新加载配置（进程不重启）              |
| enable     | 开机自启                       |
| disable    | 禁止开机自启                     |
| status     | 查看状态和最近日志                  |
| is-active  | 检查是否运行（返回 active/inactive） |
| is-enabled | 检查是否开机自启                   |

### journalctl — 查看系统日志

```bash
journalctl                          # 查看所有日志
journalctl -f                       # 实时追踪日志（类似 tail -f）
journalctl -u nginx                 # 查看 nginx 服务的日志
journalctl -n 50                    # 查看最近 50 条
journalctl --since "2026-03-01"     # 查看指定时间后的日志
journalctl --since "1 hour ago"     # 查看最近 1 小时
journalctl -p err                   # 只看错误级别的日志

```

---

## 十三、定时任务（crontab）

```bash
crontab -e              # 编辑当前用户的定时任务
crontab -l              # 列出当前用户的定时任务
crontab -r              # 删除当前用户的所有定时任务
sudo crontab -u alice -e   # 编辑 alice 的定时任务

```

**cron 表达式格式（5 位）**

```
*  *  *  *  *  command
│  │  │  │  └─ 星期几 (0-7，0和7都是周日)
│  │  │  └──── 月份 (1-12)
│  │  └─────── 日期 (1-31)
│  └────────── 小时 (0-23)
└───────────── 分钟 (0-59)

```

**常用 cron 示例**

```bash
# 每分钟执行
* * * * * /path/to/command

# 每天凌晨 2:30 执行备份
30 2 * * * /home/alice/backup.sh

# 每周一 9:00 发送报告
0 9 * * 1 /usr/local/bin/send_report.sh

# 每 5 分钟执行一次
*/5 * * * * /path/to/script.sh

# 每月 1 日和 15 日执行
0 0 1,15 * * /path/to/script.sh

# 每天工作日（周一到周五）18:00
0 18 * * 1-5 /path/to/script.sh

```

---

## 十四、Shell 脚本基础

### 基本结构

```bash
#!/bin/bash
# 脚本描述：这是一个示例脚本

# 变量定义（等号两边不能有空格）
name="Alice"
age=25
readonly PI=3.14   # 只读变量

# 输出
echo "Hello, $name!"
echo "年龄：${age}岁"   # 用 {} 避免歧义

# 环境变量
export MY_VAR="value"   # 导出为环境变量（子进程可见）

```

### 条件判断

```bash
#!/bin/bash

# if 语句
if [ $age -ge 18 ]; then
    echo "成年"
elif [ $age -ge 13 ]; then
    echo "青少年"
else
    echo "儿童"
fi

# 文件判断
if [ -f "/etc/nginx/nginx.conf" ]; then
    echo "nginx 配置存在"
fi

if [ -d "/opt/myapp" ]; then
    echo "目录存在"
fi

```

**test 常用判断**

| 表达式         | 说明          |
| ----------- | ----------- |
| \-f file    | 文件存在且是普通文件  |
| \-d dir     | 目录存在        |
| \-e path    | 路径存在（文件或目录） |
| \-r file    | 文件可读        |
| \-w file    | 文件可写        |
| \-x file    | 文件可执行       |
| \-z str     | 字符串为空       |
| \-n str     | 字符串非空       |
| str1 = str2 | 字符串相等       |
| n1 -eq n2   | 数字相等        |
| n1 -lt n2   | n1 小于 n2    |
| n1 -gt n2   | n1 大于 n2    |
| n1 -le n2   | n1 小于等于 n2  |
| n1 -ge n2   | n1 大于等于 n2  |

### 循环

```bash
#!/bin/bash

# for 循环
for i in 1 2 3 4 5; do
    echo "第 $i 次"
done

# C 风格 for 循环
for ((i=1; i<=10; i++)); do
    echo $i
done

# 遍历文件
for file in /var/log/*.log; do
    echo "处理：$file"
done

# while 循环
count=0
while [ $count -lt 5 ]; do
    echo "count = $count"
    ((count++))
done

# 读取文件每行
while IFS= read -r line; do
    echo "$line"
done < input.txt

```

### 函数

```bash
#!/bin/bash

# 定义函数
greet() {
    local name=$1      # 使用 local 声明局部变量
    local greeting=$2
    echo "${greeting}, ${name}!"
    return 0           # 返回值（0表示成功，非0表示失败）
}

# 调用函数
greet "Alice" "你好"

# 特殊变量
echo "脚本名：$0"
echo "第1个参数：$1"
echo "参数个数：$#"
echo "所有参数：$@"
echo "上一命令退出码：$?"
echo "当前进程ID：$$"

```

### 综合示例：自动备份脚本

```bash
#!/bin/bash
# backup.sh - 自动备份脚本

# 配置
SOURCE_DIR="/home/alice/projects"
BACKUP_DIR="/backup"
DATE=$(date +%Y-%m-%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.tar.gz"
LOG_FILE="/var/log/backup.log"
MAX_BACKUPS=7   # 保留最近7个备份

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 检查备份目录
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    log "创建备份目录：$BACKUP_DIR"
fi

# 执行备份
log "开始备份：$SOURCE_DIR"
tar -czf "$BACKUP_FILE" "$SOURCE_DIR" 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then
    log "备份成功：$BACKUP_FILE"
else
    log "备份失败！"
    exit 1
fi

# 清理旧备份（保留最近 MAX_BACKUPS 个）
BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null | wc -l)
if [ "$BACKUP_COUNT" -gt "$MAX_BACKUPS" ]; then
    DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
    ls -1t "${BACKUP_DIR}"/backup_*.tar.gz | tail -n "$DELETE_COUNT" | xargs rm -f
    log "清理了 $DELETE_COUNT 个旧备份"
fi

log "备份完成"

```

---

## 十五、环境变量

```bash
env                         # 查看所有环境变量
echo $PATH                  # 查看 PATH
echo $HOME                  # 主目录
echo $USER                  # 当前用户
echo $SHELL                 # 当前 Shell

# 临时设置（仅当前会话）
export MY_VAR="hello"

# 永久设置（写入配置文件）
echo 'export MY_VAR="hello"' >> ~/.bashrc
echo 'export PATH="$PATH:/opt/mytool/bin"' >> ~/.bashrc
source ~/.bashrc            # 立即生效（不用重启终端）

# 配置文件加载顺序（登录 shell）
# /etc/profile → ~/.bash_profile → ~/.bashrc

```

---

## 十六、Vim 基础

Vim 是服务器上最常见的编辑器，必须掌握基本操作。

### 三种模式

| 模式             | 说明        | 如何进入         |
| -------------- | --------- | ------------ |
| 普通模式（Normal）   | 移动光标、执行命令 | 按 Esc        |
| 插入模式（Insert）   | 输入文字      | 在普通模式按 i/a/o |
| 命令行模式（Command） | 保存、退出、搜索  | 在普通模式按 :     |

### 常用操作速查

```
# 进入插入模式
i    在光标前插入
a    在光标后插入
o    在当前行下方新建行并插入
O    在当前行上方新建行并插入

# 移动（普通模式）
h j k l    左下上右
0          行首
$          行尾
gg         文件开头
G          文件末尾
:n         跳到第 n 行

# 编辑（普通模式）
dd         删除当前行
yy         复制当前行
p          粘贴到下方
u          撤销
Ctrl+r     重做
x          删除光标处字符
dw         删除一个单词

# 搜索
/pattern   向下搜索
?pattern   向上搜索
n          下一个结果
N          上一个结果

# 替换（命令行模式）
:%s/old/new/g      全文替换
:5,10s/old/new/g   第5到10行替换

# 保存退出（命令行模式）
:w         保存
:q         退出（未修改时）
:wq        保存并退出
:q!        强制退出（不保存）
:wqa       保存所有文件并退出
ZZ         快捷保存退出（普通模式）

```

---

## 十七、实用技巧

### 快捷键大全

| 快捷键     | 说明                   |
| ------- | -------------------- |
| Ctrl+C  | 中断当前命令               |
| Ctrl+D  | 输入 EOF，或退出当前 Shell   |
| Ctrl+Z  | 暂停当前进程（放入后台）         |
| Ctrl+L  | 清屏（等同于 clear）        |
| Ctrl+A  | 光标移到行首               |
| Ctrl+E  | 光标移到行尾               |
| Ctrl+U  | 删除光标前所有字符            |
| Ctrl+K  | 删除光标后所有字符            |
| Ctrl+W  | 删除光标前一个单词            |
| Ctrl+R  | 反向搜索历史命令             |
| Tab     | 自动补全                 |
| Tab Tab | 显示所有候选补全             |
| !!      | 重复上一条命令              |
| !n      | 执行历史中第 n 条命令         |
| !string | 执行最近一条以 string 开头的命令 |

### alias — 命令别名

```bash
alias ll='ls -la'                   # 定义别名
alias gs='git status'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'

# 永久生效（写入 ~/.bashrc）
echo "alias ll='ls -la'" >> ~/.bashrc
source ~/.bashrc

unalias ll          # 删除别名
alias               # 查看所有别名

```

### history — 历史命令

```bash
history             # 查看历史命令
history 20          # 查看最近 20 条
history | grep git  # 搜索历史中含 git 的命令
!100                # 执行历史中第 100 条命令
!!                  # 执行上一条命令
sudo !!             # 用 sudo 执行上一条命令（很实用）
Ctrl+R              # 交互式搜索历史（按 Ctrl+R 继续向前搜索）

```

### 通配符

```bash
ls *.txt            # 匹配任意字符（0个或多个）
ls file?.txt        # ? 匹配单个任意字符
ls file[123].txt    # [] 匹配括号内的字符之一
ls file[a-z].txt    # 字符范围

```

### tmux — 终端复用（保持会话）

```bash
tmux                        # 启动 tmux
tmux new -s mysession       # 创建命名会话
tmux ls                     # 列出会话
tmux attach -t mysession    # 重新连接会话

# tmux 内快捷键（前缀 Ctrl+B）
Ctrl+B d        # 分离会话（程序继续在后台运行）
Ctrl+B c        # 新建窗口
Ctrl+B n        # 下一个窗口
Ctrl+B p        # 上一个窗口
Ctrl+B %        # 左右分割面板
Ctrl+B "        # 上下分割面板
Ctrl+B 方向键   # 切换面板
Ctrl+B [        # 进入滚动模式（q 退出）

```

---

## 十八、常见陷阱与注意事项

### 1\. rm -rf 是危险命令

```bash
# 永远不要运行
rm -rf /           # 删除整个系统！
rm -rf /*          # 同上

# 最佳实践：先用 ls 确认，再用 rm
ls /tmp/mydir/     # 先看一眼
rm -rf /tmp/mydir/ # 再删除

```

### 2\. 等号两边不能有空格

```bash
# 错误
name = "Alice"    # 会被解释为命令 name，参数 = 和 Alice

# 正确
name="Alice"

```

### 3\. 引用变量时使用双引号

```bash
filename="my file.txt"

# 错误：空格导致参数分割
rm $filename       # 等于 rm my file.txt（删除两个文件）

# 正确：双引号保留空格
rm "$filename"

```

### 4\. $? 只保留最近一次命令的退出码

```bash
command1
command2
echo $?       # 这是 command2 的退出码，不是 command1 的

```

### 5\. 脚本的可执行权限

```bash
chmod +x script.sh    # 添加执行权限
./script.sh           # 执行（注意要有 ./）
bash script.sh        # 不需要执行权限的方式

```

### 6\. 路径中含空格要加引号

```bash
cd /home/my user/     # 错误
cd "/home/my user/"   # 正确
cd /home/my\ user/    # 也正确（反斜杠转义）

```

### 7\. 慎用 chmod 777

`chmod 777` 表示所有人可读写执行，对于 Web 服务器文件极其危险。通常用 `644`（文件）或 `755`（目录/脚本）。

### 8\. sudo 不是万能钥匙

每次 `sudo` 操作前要确认命令的作用。特别是从网上复制的命令，先理解再执行。

---

## 最佳实践

**用 `man` 命令查官方手册，而非只靠搜索引擎**：`man ls`、`man grep` 等手册页包含全部选项说明，比搜索结果更权威且可离线访问。`man -k <关键字>` 可搜索包含关键字的所有手册页。

**始终用 `-i` 或 `-n`（dry-run）选项预览危险操作的结果**：`rm`、`mv`、`cp`、`find ... -exec` 等操作在加 `-i` 后会逐个确认；`rsync --dry-run` 可预览同步内容而不实际执行。

```bash
rm -i *.log      # 逐个确认
find . -name "*.tmp" -delete -print  # 先用 -print 列出再决定是否 -delete

```

**重要目录变更前先备份**：对系统配置（`/etc/nginx/`, `/etc/ssh/`）做任何修改前，先 `cp -a 原文件 原文件.bak`，出问题可秒级恢复。

**用 `tmux` 管理长任务，防止 SSH 断连导致任务中断**：在 `tmux` 会话中运行长时间任务（备份、编译），SSH 断线后重新连接并 `tmux attach` 即可恢复会话，任务不受影响。

**学会用管道组合命令，而非写脚本**：熟练组合 `grep`、`awk`、`sort`、`uniq`、`xargs` 可以完成大量日常文本处理任务，无需编写脚本文件。

```bash
# 找出最大的 10 个文件
du -sh /var/log/* | sort -rh | head -10

# 统计日志中各 IP 的请求数
grep "GET" access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

```

---

## 常见陷阱

### 陷阱：`rm -rf` 误删文件

**现象：** 执行 `rm -rf /path/to/dir` 后，目录和文件不可恢复，没有回收站。

**原因：** Linux 的 `rm` 命令直接删除文件，不经过回收站；`-r` 递归，`-f` 强制，组合使用后果严重。路径中有空格或通配符展开时更易误操作。

**解决：** 删除前用 `ls` 确认路径；对重要操作改用 `trash-cli`（`trash path/`）代替 `rm`；或先 `mv` 到 `/tmp` 观察一段时间再删除。

```bash
# 危险：通配符展开可能超出预期
rm -rf /var/log/*.log /backup

# 更安全：先确认
ls /var/log/*.log
# 确认后再删
rm /var/log/*.log

```

### 陷阱：`chmod 777` 解决权限问题

**现象：** 遇到权限错误就 `chmod 777 /path`，问题暂时消失，但留下安全隐患。

**原因：** `777` 给所有用户赋予读写执行权限，其他用户（包括 www-data、运行中的服务进程）都可以修改甚至执行该文件，存在提权风险。

**解决：** 先用 `ls -la` 确认文件所有者和当前权限，用 `chown` 修改所有者到正确用户，再用最小必要权限（如 `644` 配置文件，`755` 目录，`600` 私钥）。

```bash
# 查看文件所有者
ls -la /etc/nginx/nginx.conf

# 修改所有者（不改权限）
sudo chown nginx:nginx /etc/nginx/nginx.conf

# 设置最小权限
sudo chmod 644 /etc/nginx/nginx.conf

```

### 陷阱：后台进程在 SSH 断开后终止

**现象：** SSH 连接断开后，之前在终端运行的长时间任务（训练脚本、下载）也随之终止。

**原因：** SSH 会话结束时，终端（TTY）关闭，系统向会话组内所有进程发送 `SIGHUP` 信号，未处理该信号的进程会退出。

**解决：** 用 `tmux` 或 `screen` 在独立会话中运行任务，SSH 断线后任务继续运行，重连后 `tmux attach` 恢复。或用 `nohup command &` 让进程忽略 SIGHUP。

```bash
# 推荐：用 tmux
tmux new -s mytask
# 在 tmux 里运行任务
python train.py
# 断开：Ctrl+B, D
# 重连后恢复
tmux attach -t mytask

```

---

## 参见

- [Linux进阶](https://blog.vercanti.com/linux-jin-jie/)
- [Git进阶指南](https://blog.vercanti.com/git-jin-jie-zhi-nan/)
- [Docker初级指南](https://blog.vercanti.com/docker-chu-ji-zhi-nan/)
- [Nginx完全指南](https://blog.vercanti.com/nginx-wan-quan-zhi-nan/)