Linux 入门完全指南

Linux 是一个开源的操作系统内核,由 Linus Torvalds 于 1991 年创建。我们日常说的"Linux"通常指以 Linux 内核为基础的各种发行版。 常见发行版对比 ls -l 输出解读 ls 常用参数表 mkdir 参数表 rm 参数表 cp 参数表 less 内部操作 find 常用参数表 grep 常用参数表 awk 常用变量 权限数字对应 常用权限:755(所有者全权,其他只读执行)、644(所有者读写,其他只读)、600(私密文件) chmod 符号参数 useradd 参数表 ps aux 输出字段 top 内部操作 常用信

分享

官方文档: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 [选项] [参数],选项通常以 --- 开头
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/  挂载点

路径

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

二、文件与目录操作

pwd — 显示当前目录

pwd
# 输出:/home/alice/projects

ls — 列出目录内容

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 — 切换目录

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

mkdir — 创建目录

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 时务必确认路径!

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 — 复制

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 — 移动/重命名

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

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

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

stat — 查看文件详细信息

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

三、查看文件内容

cat — 输出文件内容

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

less — 分页查看(推荐)

less file.txt

less 内部操作

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

head / tail — 查看头尾

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 — 统计行数/字数/字节数

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

四、文件搜索

find — 按条件搜索文件

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 — 文本搜索

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

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

五、文本处理

管道与重定向

# 重定向
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 — 排序

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 — 去重

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

cut — 提取字段

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 — 文本处理利器

# 基本结构: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 — 流编辑器

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 — 修改权限

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 — 修改所有者

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

sudo 与 su

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

七、用户与组管理

# 查看当前用户信息
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 — 查看进程

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 — 实时进程监控

top                     # 启动 top

top 内部操作

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

kill — 发送信号

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)

后台运行

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

九、磁盘与存储

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

十、网络命令

ping

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 请求

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 — 下载文件

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 — 远程登录

ssh [email protected]          # 连接远程服务器
ssh -p 2222 [email protected]     # 指定端口
ssh -i ~/.ssh/id_rsa user@host  # 指定私钥文件

# 生成 SSH 密钥对(免密登录)
ssh-keygen -t ed25519 -C "[email protected]"
# 将公钥上传到服务器
ssh-copy-id [email protected]

~/.ssh/config 配置(简化连接)

Host myserver
    HostName 192.168.1.100
    User alice
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
ssh myserver        # 使用配置后简化连接

scp — 远程复制

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/      # 指定端口

查看端口与连接

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

十一、软件包管理

apt(Ubuntu/Debian)

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)

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

十二、系统服务管理(systemctl)

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 — 查看系统日志

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)

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 示例

# 每分钟执行
* * * * * /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 脚本基础

基本结构

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

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

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

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

条件判断

#!/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

循环

#!/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

函数

#!/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:$$"

综合示例:自动备份脚本

#!/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 "备份完成"

十五、环境变量

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 — 命令别名

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 — 历史命令

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

通配符

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

tmux — 终端复用(保持会话)

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 是危险命令

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

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

2. 等号两边不能有空格

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

# 正确
name="Alice"

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

filename="my file.txt"

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

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

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

command1
command2
echo $?       # 这是 command2 的退出码,不是 command1 的

5. 脚本的可执行权限

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

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

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 lsman grep 等手册页包含全部选项说明,比搜索结果更权威且可离线访问。man -k <关键字> 可搜索包含关键字的所有手册页。

始终用 -i-n(dry-run)选项预览危险操作的结果rmmvcpfind ... -exec 等操作在加 -i 后会逐个确认;rsync --dry-run 可预览同步内容而不实际执行。

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

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

tmux 管理长任务,防止 SSH 断连导致任务中断:在 tmux 会话中运行长时间任务(备份、编译),SSH 断线后重新连接并 tmux attach 即可恢复会话,任务不受影响。

学会用管道组合命令,而非写脚本:熟练组合 grepawksortuniqxargs 可以完成大量日常文本处理任务,无需编写脚本文件。

# 找出最大的 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-clitrash path/)代替 rm;或先 mv/tmp 观察一段时间再删除。

# 危险:通配符展开可能超出预期
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 私钥)。

# 查看文件所有者
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 信号,未处理该信号的进程会退出。

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

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

参见

阅读更多

Web 安全基础

1. HTML 转义(服务端渲染必须): 2. CSP(Content Security Policy): 3. HttpOnly Cookie:防止 JS 读取会话 Cookie: 4. 前端框架防护: 攻击者在第三方网站构造一个表单,诱导已登录用户提交,浏览器会自动携带目标站的 Cookie。 触发条件: 1. 用户已登录目标网站(Cookie 有效) 2. 目标 API 仅凭 Cookie 识别用户身份 3. 请求来源未验证 1. CSRF Token(推荐): 2. SameSite Cookie: 3. 验证 Origin/Referer 头:

By yellowdog

HTTP 协议深度指南

HTTP(HyperText Transfer Protocol)是 Web 的基础传输协议,基于 TCP/IP,采用请求/响应模型。 相关文档:Web安全基础(/web-an-quan-ji-chu/) FastAPI完全指南(/fastapi-wan-quan-zhi-nan/) Nginx完全指南(/nginx-wan-quan-zhi-nan/) 幂等性:多次执行相同请求,服务器状态结果相同。PUT /users/1 多次执行结果一致;POST /users 每次创建新资源,非幂等。 浏览器直接从本地缓存读取,不向服务器发送请求。 缓存命中时,状

By yellowdog

系统设计基础

SLA 对照表: 选择建议:无状态服务(Web 层、API 层)优先水平扩展;数据库初期垂直扩展,达到瓶颈后考虑分库分表或读写分离。 缓存穿透(查询不存在的 key,每次都打到 DB): 缓存击穿(热点 key 过期,瞬间大量请求打到 DB): 缓存雪崩(大量 key 同时过期,或缓存服务宕机): 令牌桶 Python 实现: Redis 实现分布式限流(滑动窗口): URL 命名规则: Cursor 分页响应格式: 雪花算法结构(64 bit): 定义:分布式系统不能同时满足以下三个特性: 在分布式环境中 P 是必须保证的,所以实际是 CP vs AP

By yellowdog

算法思路与模板

二分查找要求序列有序,每次将搜索范围缩减一半,时间复杂度 O(log n)。 两个指针从两端向中间收缩,常用于有序数组。 滑动窗口维护一个满足条件的区间 left, right,right 不断向右扩张,条件不满足时收缩 left。 滑动窗口通用框架: 1. 确定"子问题":原问题可以分解为哪些规模更小的同类问题 2. 定义 dpi 或 dpij 的含义,要足够清晰 3. 推导状态转移方程 4. 确定初始状态(边界条件) 5. 确定计算顺序(确保依赖的子问题先计算) 每件物品最多选一次。dpj = 容量为 j 时的最大价值,逆序遍历容量防止重复选取。 每

By yellowdog