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 ls、man grep 等手册页包含全部选项说明,比搜索结果更权威且可离线访问。man -k <关键字> 可搜索包含关键字的所有手册页。
始终用 -i 或 -n(dry-run)选项预览危险操作的结果:rm、mv、cp、find ... -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 即可恢复会话,任务不受影响。
学会用管道组合命令,而非写脚本:熟练组合 grep、awk、sort、uniq、xargs 可以完成大量日常文本处理任务,无需编写脚本文件。
# 找出最大的 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 观察一段时间再删除。
# 危险:通配符展开可能超出预期
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 信号,未处理该信号的进程会退出。
解决: 用 tmux 或 screen 在独立会话中运行任务,SSH 断线后任务继续运行,重连后 tmux attach 恢复。或用 nohup command & 让进程忽略 SIGHUP。
# 推荐:用 tmux
tmux new -s mytask
# 在 tmux 里运行任务
python train.py
# 断开:Ctrl+B, D
# 重连后恢复
tmux attach -t mytask