Debian / Linux 常用命令行速查

这份速查表整理了 Debian / Linux 日常维护最常用的命令行操作,并标明 root / sudo 的使用场景。
它按“实际想做什么”来分类:找文件、查端口、看日志、修权限、排网络、管理服务、备份同步、定位性能问题时,可以先看索引,再跳到对应章节复制修改。


快速索引

按任务查命令

我想做什么 常用命令
查看当前用户和权限 whoamiidgroupssudo -l
切换 root 或提权执行 sudo -isudo commandsudoeditsu -
查看命令帮助 command --helpmaninfotypewhich
目录跳转和查看 pwdcdls -lahtreestat
创建、复制、移动、删除 mkdir -pcp -amv -irm -irm -rf
查看文本和日志 catlessheadtail -fjournalctl
搜索文件或内容 findlocategreprgawksed
批量处理文件 find ... -execxargsrenamefor
压缩和解压 tarzipunzipgzipxzzstd
安装和卸载软件 aptapt-getdpkgapt-cacheapt-mark
查看系统信息 unamehostnamectllsb_releaselscpufree
查看磁盘空间 df -hdu -h --max-depth=1lsblkblkid
挂载磁盘 mountumountfindmnt/etc/fstab
管理用户和组 adduseruseraddpasswdusermodgroupadd
修改权限和所有者 chmodchownchgrpsetfaclgetfacl
查看进程 ps auxtophtoppgreppidof
杀进程 killpkillkillallsystemctl stop
管理服务 systemctljournalctl -usystemctl list-units
定时任务 crontabsystemctl list-timersat
网络地址和路由 ip addrip routeip linkresolvectl
查看端口占用 ss -ltnplsof -i :80fuser
测试连通性 pingcurl -Inc -vztraceroutemtr
DNS 排查 dignslookuphostresolvectl query
下载文件 curl -LOwget -caria2c
SSH 登录和传文件 sshscpsftprsync
防火墙 ufwnftiptables
查看系统日志 journalctl -xetail -f /var/log/syslogdmesg -T
性能排查 freevmstatiostatiotopsarstrace
Docker 常用操作 docker psdocker logsdocker execdocker compose
Git 基础操作 git statusgit addgit commitgit pullgit push

分类目录

使用约定

  • root 表示当前已切换到 root(提示符 #),sudo 表示普通用户前缀 sudo
  • 文中写成 sudo / root 的命令,普通用户使用 sudo,root 可直接执行。
  • 所有命令默认在 /bin/bash 环境执行;如涉及其它 shell 会额外说明。
  • 命令里的 userhostPORT/path 都是占位符,执行前替换成自己的用户名、主机、端口和路径。

高危命令先确认

下面这些命令很有用,但写错目标会造成严重数据损坏:

1
2
3
4
5
6
sudo / root rm -rf /path              # 递归强制删除
sudo / root mkfs.ext4 /dev/sdb1 # 格式化分区
sudo / root dd if=a of=b # 按块复制,目标写错会覆盖磁盘
sudo / root chown -R user:group / # 递归改所有者,范围错会毁系统
sudo / root chmod -R 777 /path # 粗暴放权,容易留下安全问题
sudo / root iptables -F # 清空防火墙规则,可能暴露服务

建议执行前先确认:

1
2
3
4
$ pwd                                 # 确认当前位置
$ ls -lah /target # 确认目标内容
$ find /target -name "*.log" -print # 先打印将处理的文件
$ find /target -name "*.log" -delete # 确认无误后再删除

常用组合键

1
2
3
4
5
6
7
8
9
Ctrl + C                  # 中断当前命令
Ctrl + D # 退出当前 shell / 输入 EOF
Ctrl + A # 光标到行首
Ctrl + E # 光标到行尾
Ctrl + U # 删除光标前全部内容
Ctrl + K # 删除光标后全部内容
Ctrl + W # 删除光标前一个单词
Ctrl + R # 反向搜索历史命令
Tab # 自动补全

0. 用户身份与权限管理

0.1 查看身份

1
2
3
4
5
6
7
$ whoami                  # 当前登录用户
$ id # 用户 UID/GID 与组信息
$ groups # 当前用户所在组
$ logname # 最初登录用户名
$ who # 当前登录会话
$ w # 谁在线以及正在执行什么
$ sudo -l # 查看当前用户可 sudo 执行的命令

0.2 切换到 root

1
2
3
4
$ sudo -i                 # 推荐:root login shell
$ sudo -s # root 交互 shell(保留部分环境变量)
$ sudo su - # 不推荐的 su 叠加写法
$ su - # 使用 root 密码切换(默认可能未启用)

如需启用 root 密码,可执行 sudo passwd root(注意存在安全风险)。

0.3 以其他用户执行

1
2
3
4
5
$ sudo -u www-data command        # 以 www-data 身份执行
$ sudo -iu postgres psql # 以 postgres 登录 shell 运行 psql
$ sudo -H -u appuser bash # 以 appuser 打开 shell,并设置 HOME
$ sudo -E VAR=value command # 保留环境变量(受 sudoers secure_path 影响)
$ sudoedit /etc/nginx/nginx.conf # 安全编辑 root 级别文件

0.4 用户与组管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo / root adduser alice                 # Debian 推荐:交互式创建用户
sudo / root useradd -m -s /bin/bash bob # 低层命令:创建用户和家目录
sudo / root passwd alice # 修改用户密码
sudo / root passwd -l alice # 锁定密码登录
sudo / root passwd -u alice # 解锁密码登录
sudo / root usermod -aG sudo alice # 加入 sudo 组
sudo / root usermod -aG docker alice # 加入 docker 组,需重新登录
sudo / root gpasswd -d alice docker # 从 docker 组移除
sudo / root userdel alice # 删除用户,保留家目录
sudo / root userdel -r alice # 删除用户和家目录

$ getent passwd alice # 查看用户数据库条目
$ getent group sudo # 查看组条目和成员
$ compgen -u # 列出用户
$ compgen -g # 列出组

0.5 权限细节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ls -lah file                            # 看权限、所有者、组
$ namei -l /var/www/site/index.html # 逐级查看路径权限
sudo / root chmod 644 file # 普通文件常用权限
sudo / root chmod 600 secret.key # 私钥常用权限
sudo / root chmod 755 script.sh # 脚本可执行
sudo / root chmod +x script.sh # 增加执行权限
sudo / root chmod -R u=rwX,g=rX,o= dir # 目录递归安全模板
sudo / root chown user:group file # 修改所有者和组
sudo / root chown -R www-data:www-data /var/www/site # 递归把网站目录交给 www-data 用户和组

$ getfacl file # 查看 ACL
sudo / root setfacl -m u:alice:rw file # 给 alice 额外读写权限
sudo / root setfacl -m g:dev:rX dir # 给 dev 组读和进入目录权限
sudo / root setfacl -b file # 清除 ACL

1. 帮助系统

1
2
3
4
5
6
7
8
9
10
11
$ command --help          # 命令自带帮助
$ man command # 联机手册(/ 搜索,q 退出)
$ info command # GNU info 文档
$ apropos keyword # 按关键词查 man(等价 man -k)
$ whatis command # 一句话说明命令用途
$ type command # 判断内建 / 外部命令 / 别名
$ type -a command # 显示所有同名命令位置
$ which command # 命令所在路径
$ command -v command # 更适合脚本判断命令是否存在
$ whereis command # 查二进制、源码、man 位置
$ readlink -f /path/link # 查看软链接最终指向

man 内常用按键:

1
2
3
4
5
6
/keyword                  搜索关键词
n 下一个匹配
N 上一个匹配
g 回到开头
G 到末尾
q 退出

2. 软件包管理(APT / dpkg)

适用于 Debian 10/11/12;apt 面向交互,apt-get 更适合脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sudo / root apt update                      # 同步索引
sudo / root apt upgrade # 常规升级
sudo / root apt full-upgrade # 允许安装/移除依赖的升级
sudo / root apt install pkg1 pkg2 # 安装软件包
sudo / root apt install pkg=version # 指定版本
sudo / root apt remove pkg # 卸载保留配置
sudo / root apt purge pkg # 卸载并移除配置
sudo / root apt autoremove # 清理孤儿依赖
sudo / root apt list --upgradable # 查看可升级包
sudo / root apt search keyword # 搜索包名称/描述
sudo / root apt show pkg # 包详情
sudo / root apt policy pkg # 候选版本与仓库
sudo / root apt list --installed # 已安装包
sudo / root apt-mark hold pkg # 锁定版本
sudo / root apt-mark unhold pkg # 取消锁定
$ apt-mark showhold # 查看锁定包
$ apt-cache madison pkg # 查看可用版本列表

sudo / root dpkg -i ./file.deb # 安装本地 deb
sudo / root apt -f install # 修复依赖
sudo / root dpkg -l | grep pkg # 查看安装状态
sudo / root dpkg -L pkg # 查看包安装的文件
sudo / root dpkg -S /path/file # 查文件属于哪个包
sudo / root dpkg-reconfigure tzdata # 重新配置软件包

sudo / root apt clean && apt autoclean # 清理缓存

搜索未安装包的文件可使用 apt-file

1
2
3
sudo / root apt install apt-file          # 安装 apt-file 工具
sudo / root apt-file update # 更新 apt-file 文件索引
$ apt-file search bin/nmap # 搜索哪个包提供 bin/nmap 文件

2.1 软件源与缓存

1
2
3
4
5
6
$ cat /etc/apt/sources.list               # 查看主软件源配置
$ ls -lah /etc/apt/sources.list.d/ # 查看额外软件源目录
sudo / root cp -a /etc/apt/sources.list /etc/apt/sources.list.bak # 备份软件源配置
sudo / root apt update # 修改软件源后重新同步索引
sudo / root apt clean # 清空下载缓存
sudo / root apt autoclean # 清理过期缓存

2.2 apt-get 脚本写法

1
2
3
4
sudo / root apt-get update                 # 脚本中更新软件源索引
sudo / root apt-get install -y nginx curl # 非交互安装 nginx 和 curl
sudo / root apt-get remove -y nginx # 非交互卸载 nginx,保留配置
sudo / root apt-get autoremove -y # 非交互清理无用依赖

脚本里建议加上失败即停止,例如:

1
2
3
4
5
#!/usr/bin/env bash
set -euo pipefail # 遇到错误、未定义变量或管道失败就退出

apt-get update # 更新软件源索引
apt-get install -y curl vim # 安装 curl 和 vim

3. 文件与目录操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ pwd                                # 当前目录
$ ls -lah # 列出含隐藏文件
$ ls -ltr # 按修改时间排序,旧到新
$ ls -lhS # 按大小排序
$ ls -d */ # 只列目录
$ tree -L 2 # 树形查看需先 apt install tree
$ cd ~ # 回到当前用户家目录
$ cd - # 返回上一个目录
$ pushd /var/log # 压栈进入目录
$ popd # 返回 pushd 前目录

sudo / root mkdir -p /opt/app/log # 递归建目录
sudo / root mkdir -p app/{bin,conf,logs} # 一次创建 bin、conf、logs 三个子目录
sudo / root cp -a src/ dst/ # 保留属性复制
sudo / root cp -i a b # 覆盖前询问
sudo / root mv -i a b # 带确认的移动/重命名
sudo / root rm -i file # 删除前询问
sudo / root rm -rf /path # 谨慎:递归删除

$ stat file # 查看详细属性
$ file file # 判断文件类型
$ du -sh dir # 查看目录总大小
$ realpath file # 获取绝对路径
$ readlink link # 查看软链指向
sudo / root ln -s /real target # 创建软链
sudo / root ln -sfn /new/release current # 原子式切换软链
$ touch file # 新建或更新时间戳

sudo / root chmod 640 file # 修改权限(数字/符号均可)
sudo / root chmod -R u=rwX,g=rX dir # 递归设置目录可进入、文件不乱加执行权限
sudo / root chown user:group file # 修改所有者
sudo / root chgrp group file # 修改所属组

3.1 文本查阅

1
2
3
4
5
6
7
8
9
10
$ cat file                           # 输出文件
$ tac file # 逆序输出
$ nl file # 带行号输出
$ head -n 20 file # 前 20 行
$ tail -n 50 file # 后 50 行
$ tail -f /var/log/syslog # 追踪日志
$ tail -F app.log # 文件轮转后继续追踪新文件
$ less file # 分屏查看(/ 搜索)
$ sed -n '10,20p' file # 打印指定行
$ diff -u file1 file2 # 比较差异

less 常用按键:

1
2
3
4
5
6
7
Space / f                  下一页
b 上一页
g 开头
G 结尾
/keyword 搜索
n / N 下一个 / 上一个匹配
q 退出

3.2 搜索与替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ find /etc -maxdepth 1 -type f      # 查找文件
$ find . -name "*.log" -size +10M # 条件组合
$ find . -iname "*.jpg" # 忽略大小写
$ find /var -type f -mtime +7 # 7 天前修改过的文件
$ find . -type f -empty # 空文件
$ find . -perm 777 # 权限为 777
$ locate nginx.conf # 需先 sudo updatedb
$ grep -R "pattern" /var/log # 递归文本搜索
$ grep -n "ERROR" app.log # 显示行号
$ grep -i "error" app.log # 忽略大小写
$ grep -v "DEBUG" app.log # 排除匹配行
$ grep -E "error|failed|timeout" app.log # 用扩展正则同时搜索多个关键词
$ grep -C 3 "ERROR" app.log # 前后各 3 行
# 递归搜索 Nginx 日志中的 ERROR,跳过二进制文件并高亮结果
$ grep -R --binary-files=without-match \
--color "ERROR" /var/log/nginx # 常用参数示例
$ sed -i 's/foo/bar/g' file # 原地替换
$ awk '{print $1,$NF}' file # awk 取字段
$ xargs -0 rm < list.txt # 配合 -print0 的安全删除

如果安装了 ripgreprg 通常更快:

1
2
3
4
$ rg "ERROR" /var/log                      # 快速递归搜索 ERROR
$ rg -n "server_name" /etc/nginx # 搜索并显示行号
$ rg -i "timeout|refused" . # 忽略大小写搜索多个关键词
$ rg --files # 快速列出当前目录下的文件

3.3 sort、uniq、cut、tr、wc

1
2
3
4
5
6
7
8
9
10
$ wc -l file                         # 行数
$ wc -c file # 字节数
$ cut -d: -f1 /etc/passwd # 按 : 取第 1 字段
$ sort file # 排序
$ sort -n nums.txt # 数字排序
$ sort -hr sizes.txt # 人类可读大小排序
$ uniq file # 去掉相邻重复行
$ sort file | uniq -c | sort -nr # 统计出现次数
$ tr 'a-z' 'A-Z' < file # 小写转大写
$ tr -d '\r' < win.txt > unix.txt # 删除 Windows CR

3.4 JSON 与结构化文本

1
2
3
4
5
sudo / root apt install jq                  # 安装 JSON 处理工具 jq
$ jq . data.json # 格式化 JSON
$ jq '.name' data.json # 取字段
$ jq -r '.items[].url' data.json # 原始字符串输出
$ curl -s https://api.github.com | jq . # 拉取接口 JSON 并格式化显示

4. 压缩与归档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sudo / root tar -cvf backup.tar dir/        # 只归档,不压缩
sudo / root tar -xvf backup.tar # 解包 tar
sudo / root tar -czvf backup.tar.gz dir/ # gzip 压缩
sudo / root tar -xzvf backup.tar.gz # 解压 gzip tar
sudo / root tar -cjvf backup.tar.bz2 dir/ # bzip2 压缩
sudo / root tar -xjvf backup.tar.bz2 # 解压 bzip2 tar
sudo / root tar -cJvf backup.tar.xz dir/ # xz 压缩
sudo / root tar -xJvf backup.tar.xz # 解压 xz tar
sudo / root tar -tzvf backup.tar.gz # 只查看内容
sudo / root tar --exclude=node_modules -czf app.tar.gz app/ # 打包 app 并排除 node_modules

$ zip -r archive.zip dir/ # ZIP 打包
$ unzip archive.zip -d ./out # 解压到 out
$ unzip -l archive.zip # 查看 zip 内容
$ gzip file # gzip 压缩,原文件变 file.gz
$ gzip -k file # gzip 压缩并保留原文件
$ gunzip file.gz # gzip 解压
$ xz -z file # xz 压缩
$ xz -d file.xz # xz 解压
$ zstd file # zstd 压缩,需安装 zstd
$ unzstd file.zst # zstd 解压
$ sha256sum file # 计算 SHA256
$ sha256sum -c SHA256SUMS # 按校验文件验证

5. 进程与系统资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ top                                      # 实时资源
$ htop # 需 sudo apt install htop
$ ps aux | grep nginx # 查看进程
$ ps -ef # 另一种常用进程格式
$ pgrep nginx # 按名称找 PID
$ pgrep -a nginx # PID + 完整命令
$ pstree -ap # 进程树,需 psmisc
sudo / root systemctl status nginx # 服务状态
sudo / root systemctl restart nginx # 重启服务
sudo / root systemctl enable nginx # 开机自启

$ pidof process # 获取进程 PID
sudo / root kill -SIGTERM PID # 发送信号
sudo / root kill -9 PID # 强制结束
sudo / root pkill nginx # 按进程名结束
sudo / root pkill -f "python app.py" # 按完整命令行匹配
sudo / root killall nginx # 结束所有 nginx
sudo / root renice -n -5 -p PID # 调整优先级

5.1 后台运行与作业控制

1
2
3
4
5
6
$ command &                                # 放到后台
$ jobs # 查看当前 shell 后台任务
$ fg %1 # 切回前台
$ bg %1 # 后台继续执行
$ nohup command > app.log 2>&1 & # 退出终端后继续运行
$ disown -h %1 # 从当前 shell 作业表移除

5.2 系统资源监控

1
2
3
4
5
6
7
8
9
10
$ free -h                                  # 内存
$ vmstat 1 5 # 虚拟内存统计
$ iostat -xz 1 # IO 统计(需 sysstat)
$ mpstat 1 # CPU 使用率
$ pidstat 1 # 进程级 CPU,需 sysstat
$ pidstat -d 1 # 进程级 IO
$ ps aux --sort=-%mem | head # 内存占用最高的进程
$ ps aux --sort=-%cpu | head # CPU 占用最高的进程
$ uptime # 系统运行时长
$ dmesg -T | tail # 内核消息

负载粗略理解:

1
2
3
load average 接近 CPU 核心数:系统比较忙
明显超过 CPU 核心数:可能排队严重
CPU 不高但负载高:常见于 IO 等待或不可中断睡眠

6. 服务与启动项(systemd)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo / root systemctl list-units --type=service     # 列出服务
sudo / root systemctl enable name # 启用开机自启
sudo / root systemctl disable name # 禁用开机自启
sudo / root systemctl start name # 启动服务
sudo / root systemctl stop name # 停止服务
sudo / root systemctl restart name # 重启服务
sudo / root systemctl reload name # 重新加载配置
sudo / root systemctl status name # 查看状态
sudo / root systemctl is-enabled name # 是否开机自启
sudo / root systemctl is-active name # 是否正在运行
sudo / root systemctl list-unit-files --type=service # 列出所有服务单元文件及启用状态
sudo / root systemctl --failed # 查看失败服务
sudo / root systemctl cat name # 查看 unit 内容
sudo / root systemctl daemon-reload # unit 文件变化后重载
sudo / root journalctl -u name -f # 实时日志
sudo / root journalctl -u name --since "1 hour ago" # 指定时间日志

6.1 定时任务

1
2
3
4
5
$ crontab -e                                     # 当前用户 cron
$ sudo crontab -e # root cron
$ crontab -l # 列出任务
sudo / root systemctl list-timers # systemd 定时任务
sudo / root systemctl status timer-name.timer # 定时器状态

cron 时间格式:

1
2
* * * * * command
分 时 日 月 周

示例:

1
2
3
4
5
# 每天 03:30 执行备份
30 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# 每 5 分钟执行一次
*/5 * * * * /usr/local/bin/check.sh

6.2 at 一次性任务

1
2
3
4
5
sudo / root apt install at                  # 安装一次性定时任务工具
sudo / root systemctl enable --now atd # 启用并立即启动 at 后台服务
$ echo "touch /tmp/at-test" | at now + 5 minutes # 5 分钟后创建测试文件
$ atq # 查看等待执行的 at 任务
$ atrm JOB_ID # 删除指定 at 任务

7. 系统信息与内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ uname -a                          # 内核版本
$ uname -r # 仅内核版本
$ lsb_release -a # 发行版信息(需 lsb-release)
$ hostnamectl # 主机名与硬件概要
$ cat /etc/os-release # OS 描述
$ uptime # 运行时长和负载
$ who -b # 最近一次启动时间
$ df -h # 磁盘使用(单位 B)
$ df -i # inode 使用情况
$ du -h --max-depth=1 /var # 目录占用
$ lsblk # 块设备
$ lsblk -f # 文件系统类型和 UUID
$ blkid # 块设备 UUID
sudo / root fdisk -l # 分区表
$ lscpu # CPU 信息
$ nproc # CPU 核心数
$ free -m # 内存
$ free -h # 人类可读内存
$ sensors # 温度(lm-sensors)

7.1 时间、时区与主机名

1
2
3
4
5
6
7
8
9
$ date                                     # 查看当前系统时间
$ timedatectl # 查看时间、时区、NTP 同步状态
$ timedatectl list-timezones | grep Shanghai # 查找上海时区名称
sudo / root timedatectl set-timezone Asia/Shanghai # 设置时区为中国上海
sudo / root timedatectl set-ntp true # 开启 NTP 自动校时
$ hostname # 查看当前主机名
sudo / root hostnamectl set-hostname server-01 # 修改主机名
$ cat /etc/hostname # 查看静态主机名配置
$ cat /etc/hosts # 查看本地域名解析配置

7.2 环境变量

1
2
3
4
5
6
7
$ env                              # 所有环境变量
$ printenv PATH # 查看 PATH 环境变量
$ echo "$PATH" # 输出 PATH 内容
$ export APP_ENV=production # 当前 shell 生效
$ unset APP_ENV # 删除当前 shell 中的环境变量
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc # 将用户 bin 加入 PATH
$ source ~/.bashrc # 立即重新加载 bash 配置

常见配置文件:

1
2
3
4
/etc/profile             全局 login shell
~/.profile 用户 login shell
~/.bashrc 用户交互式 bash
/etc/environment 全局环境变量

8. 网络与防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ip addr show                      # IP 地址
$ ip a # 简写
$ ip link # 网卡状态
$ ip route # 路由表
$ ip route get 8.8.8.8 # 到某个 IP 走哪条路由
$ ip -s link # 接口统计
$ ss -ltnp # 监听端口
$ ss -lunp # UDP 监听端口
$ ss -tunap # 所有 TCP/UDP 连接
$ ss -s # 连接统计
$ ss -putona # 连接详情
$ dig example.com +short # DNS 解析
$ dig @1.1.1.1 example.com +short # 指定 DNS 服务器查询
$ nslookup example.com # nslookup
$ host example.com # host 查询
$ resolvectl status # systemd-resolved 状态
$ resolvectl query example.com # systemd-resolved 查询
$ curl -I https://example.com # HTTP 头
$ curl -L https://example.com # 跟随跳转
$ curl -o file.html https://example.com # 下载网页并保存为 file.html
$ curl -w "\nHTTP %{http_code} in %{time_total}s\n" -o /dev/null -s https://example.com # 只输出状态码和耗时
$ wget -c URL # 断点续传下载

8.1 连接排查

1
2
3
4
5
6
7
8
9
$ ping -c 4 1.1.1.1                 # 连通性
$ traceroute example.com # 路由追踪(需安装)
$ mtr -rw example.com # 交互追踪(需安装 mtr)
$ nc -vz host port # 探测端口(netcat)
sudo / root lsof -i :80 # 查看谁占用 80 端口
sudo / root fuser -v 80/tcp # 查看端口占用
sudo / root tcpdump -i eth0 port 80 # 抓包分析
sudo / root tcpdump -i eth0 -nn -s0 -w capture.pcap # 抓完整包并保存为 pcap 文件
sudo / root tcpdump -r capture.pcap # 读取抓包文件

8.2 curl 常用写法

1
2
3
4
5
6
7
8
$ curl -I https://example.com                      # 只看响应头
$ curl -Ik https://example.com # 忽略证书错误,排错用
$ curl -LO https://example.com/file.tar.gz # 跟随跳转并保存远程文件名
$ curl --connect-timeout 5 https://example.com # 设置连接超时时间为 5 秒
# 向接口发送 JSON POST 请求,常用于测试登录、Webhook 或 API
$ curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"secret"}'

8.3 防火墙(ufw / iptables / nftables 示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo / root ufw status                     # 查看 UFW 防火墙状态
sudo / root ufw status verbose # 查看更详细的 UFW 状态
sudo / root ufw default deny incoming # 默认拒绝入站连接
sudo / root ufw default allow outgoing # 默认允许出站连接
sudo / root ufw allow 22/tcp # 放行 SSH 端口
sudo / root ufw allow 80/tcp # 放行 HTTP 端口
sudo / root ufw allow 443/tcp # 放行 HTTPS 端口
sudo / root ufw allow from 203.0.113.5 to any port 22 proto tcp # 只允许指定 IP 访问 SSH
sudo / root ufw delete allow 22/tcp # 删除 22/tcp 放行规则
sudo / root ufw enable # 启用 UFW
sudo / root ufw disable # 禁用 UFW

sudo / root iptables -L -n -v # 查看规则
sudo / root iptables -S # 规则命令格式
sudo / root iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许进入本机 22/tcp
sudo / root iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许已建立连接返回流量
sudo / root iptables -A INPUT -j DROP # 丢弃其它入站流量,谨慎放最后

sudo / root nft list ruleset # nftables 规则
sudo / root systemctl status nftables # 查看 nftables 服务状态

启用防火墙前务必确认 SSH 端口已放行,否则可能把自己锁在服务器外面。


9. 存储、挂载与备份

1
2
3
4
5
6
7
8
9
10
11
sudo / root mount /dev/sdb1 /mnt/data         # 挂载
sudo / root umount /mnt/data # 卸载
sudo / root umount -l /mnt/data # 懒卸载,谨慎
$ lsblk -f # 查看设备与挂载点
$ blkid /dev/sdb1 # 查看 UUID
$ findmnt # 当前挂载关系
sudo / root sudoedit /etc/fstab # 配置开机挂载
sudo / root mount -a # 验证 fstab
sudo / root rsync -avz src/ dest/ # 同步目录
sudo / root rsync -av --delete src/ dest/ # 保持镜像
sudo / root rsync -avn --delete src/ dest/ # dry-run 预演

9.1 磁盘空间排查

1
2
3
4
5
6
7
$ df -h                                      # 文件系统空间
$ df -i # inode 使用
$ du -sh /var/log # 目录总大小
$ du -h --max-depth=1 /var | sort -hr # 找大目录
sudo / root find / -xdev -type f -size +500M -print # 在当前文件系统查找大于 500M 的文件
sudo / root du -ah /var | sort -rh | head -n 30 # 列出 /var 下占用最大的 30 项
sudo / root lsof +L1 # 已删除但仍被进程占用的文件

lsof +L1 很适合排查“明明删了日志,磁盘空间还没回来”的情况。

9.2 /etc/fstab 开机挂载

先查 UUID:

1
2
$ lsblk -f                                  # 查看分区、文件系统和 UUID
$ blkid /dev/sdb1 # 查看指定分区的 UUID

备份并编辑:

1
2
sudo / root cp -a /etc/fstab /etc/fstab.bak # 备份开机挂载配置
sudo / root sudoedit /etc/fstab # 安全编辑开机挂载配置

示例:

1
UUID=xxxx-xxxx  /mnt/data  ext4  defaults,nofail  0  2 # 用 UUID 将 ext4 分区挂载到 /mnt/data

验证:

1
2
sudo / root mount -a                        # 按 fstab 重新挂载全部条目并检查错误
$ findmnt /mnt/data # 确认 /mnt/data 是否已挂载

9.3 swap

1
2
3
4
5
6
$ swapon --show                             # 查看当前启用的 swap
$ free -h # 查看内存和 swap 使用
sudo / root fallocate -l 2G /swapfile # 创建 2G swap 文件
sudo / root chmod 600 /swapfile # 限制 swap 文件权限
sudo / root mkswap /swapfile # 格式化为 swap
sudo / root swapon /swapfile # 立即启用 swap

写入 /etc/fstab

1
/swapfile none swap sw 0 0                  # 开机自动启用 /swapfile

9.4 LVM(简要)

1
2
3
4
5
6
7
8
9
10
sudo / root pvcreate /dev/sdb               # 将磁盘初始化为 LVM 物理卷
sudo / root vgcreate vgdata /dev/sdb # 创建名为 vgdata 的卷组
sudo / root lvcreate -L 20G -n lvbackup vgdata # 从卷组创建 20G 逻辑卷
sudo / root mkfs.ext4 /dev/vgdata/lvbackup # 将逻辑卷格式化为 ext4
sudo / root mkdir -p /mnt/backup # 创建挂载目录
sudo / root mount /dev/vgdata/lvbackup /mnt/backup # 挂载逻辑卷

$ pvs # 查看物理卷
$ vgs # 查看卷组
$ lvs # 查看逻辑卷

10. 日志与故障排查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo / root journalctl -xe                     # 最新系统日志
sudo / root journalctl -f # 实时系统日志
sudo / root journalctl -p err # 只看错误级别
sudo / root journalctl --since "today" # 今天以来
sudo / root journalctl --since "2025-11-01" # 指定时间范围
sudo / root journalctl --disk-usage # 日志占用
sudo / root journalctl --vacuum-time=7d # 只保留 7 天
sudo / root journalctl --vacuum-size=1G # 限制日志总大小
$ tail -f /var/log/syslog # 通用系统日志
$ tail -f /var/log/auth.log # 认证日志
$ tail -f /var/log/kern.log # 内核日志
$ less /var/log/nginx/error.log # 服务日志
sudo / root strace -p PID # 追踪调用
sudo / root strace -f -p PID # 跟踪子进程
sudo / root strace -o trace.log command # 保存追踪结果
sudo / root lsof -i :80 # 查看端口进程
sudo / root lsof /path/file # 查看文件被谁占用
sudo / root lsof -p PID # 查看进程打开了哪些文件
$ dmesg -T | grep -i error # 内核错误
$ dmesg -T | grep -i "error\|fail\|oom\|killed" # 查内核中的错误、失败和 OOM 记录
$ last -n 10 # 登录历史
$ lastb -n 10 # 失败登录(需 root)

10.1 常见排错流程

服务打不开:

1
2
3
4
sudo / root systemctl status service        # 查看服务状态和最近日志
sudo / root journalctl -u service -n 100 --no-pager # 查看服务最近 100 行日志
sudo / root ss -ltnp # 查看服务是否监听端口
sudo / root service-binary -t # 如果该服务支持配置检测,例如 nginx -t

端口不通:

1
2
3
4
5
6
$ ss -ltnp                                  # 查看本机监听端口
$ curl -I http://127.0.0.1:PORT # 从本机访问目标端口
$ nc -vz 127.0.0.1 PORT # 测试本机端口 TCP 连通性
$ ip route # 查看路由表
sudo / root ufw status verbose # 查看防火墙是否拦截
sudo / root tcpdump -i any port PORT # 抓取指定端口数据包

磁盘满:

1
2
3
4
5
$ df -h                                     # 查看磁盘空间是否满
$ df -i # 查看 inode 是否耗尽
sudo / root du -xh / | sort -rh | head -n 30 # 找根目录下最大文件/目录
sudo / root lsof +L1 # 找已删除但仍占空间的文件
sudo / root journalctl --disk-usage # 查看 systemd 日志占用

内存或 OOM:

1
2
3
4
$ free -h                                   # 查看内存和 swap 使用
$ ps aux --sort=-%mem | head # 查看最占内存的进程
$ dmesg -T | grep -i "out of memory\|oom" # 查内核 OOM 记录
sudo / root journalctl -k | grep -i oom # 从内核日志查 OOM

11. 安全与权限建议

  • 使用 sudo -i 获取 root 会话,完毕后及时 exit
  • 编辑系统文件优先 sudoedit,避免直接 sudo nano 遗留 root 所有权。
  • chmod / chown 操作时,先用 -R 谨慎范围,推荐测试后再递归。
  • 配置 SSH:sudo nano /etc/ssh/sshd_config → 禁止 root 远程登录、使用密钥认证。
  • 定期审计 sudo 日志:sudo cat /var/log/auth.log | grep sudo.

12. 常见小脚本

1
2
3
4
5
6
7
8
9
10
11
# 每日打包 /var/www 并保留 7 天
sudo / root bash -c 'tar -czf /backup/www-$(date +%F).tar.gz /var/www' # 按日期打包网站目录
sudo / root find /backup -name "www-*.tar.gz" -mtime +7 -delete # 删除 7 天前的网站备份

# 快速查看占用最大的目录
sudo / root du -h /var | sort -hr | head -n 20 # 查看 /var 下最大的 20 项

# 检查服务是否监听端口并返回状态码
url="https://tz.202221.xyz"
code=$(curl -ks -o /dev/null -w "%{http_code}" "$url")
printf "HTTP %s -> %s\n" "$code" "$url"

13. Shell 效率、管道与脚本片段

13.1 历史命令与快捷执行

1
2
3
4
5
6
7
8
$ history                              # 查看历史命令
$ history | grep ssh # 搜索历史命令
$ !123 # 执行 history 编号 123 的命令
$ !! # 执行上一条命令
$ sudo !! # 用 sudo 执行上一条命令
$ fc # 在编辑器里修改上一条命令后执行
$ clear # 清屏
$ reset # 终端显示错乱时重置

13.2 别名 alias

1
2
3
4
5
6
$ alias                                # 查看当前别名
$ alias ll='ls -lah' # 临时设置别名
$ alias gs='git status' # 给 git status 设置短别名
$ unalias ll # 删除别名
$ echo "alias ll='ls -lah'" >> ~/.bashrc # 将 ll 别名写入 bash 配置
$ source ~/.bashrc # 重新加载

常用别名示例:

1
2
3
4
5
alias ll='ls -lah'                         # 详细列出文件含隐藏项
alias la='ls -A' # 列出隐藏项但不显示 . 和 ..
alias grep='grep --color=auto' # grep 匹配结果自动高亮
alias ports='ss -ltnp' # 快速查看监听端口
alias untar='tar -xzvf' # 快速解压 tar.gz

13.3 管道与重定向

1
2
3
4
5
6
7
8
$ command > file                       # 覆盖写入 stdout
$ command >> file # 追加写入 stdout
$ command 2> err.log # stderr 写入文件
$ command > out.log 2>&1 # stdout 和 stderr 都写入文件
$ command | less # 管道给 less
$ command | tee out.log # 屏幕显示并写文件
$ command | tee -a out.log # 屏幕显示并追加写文件
$ command >/dev/null 2>&1 # 丢弃所有输出

13.4 命令连接符

1
2
3
4
$ make && make install                 # 前面成功才执行后面
$ command || echo "failed" # 前面失败才执行后面
$ command1; command2 # 不管成败都继续
$ (cd /tmp && ls) # 子 shell 中执行,不影响当前目录

13.5 输入输出与 here document

1
2
3
4
5
6
7
8
9
$ cat > note.txt                       # 从键盘输入,Ctrl+D 结束
$ cat <<'EOF' # 输出多行文本,EOF 之间内容原样保留
hello
world
EOF

$ sudo tee /etc/motd >/dev/null <<'EOF' # 用 root 权限写入 /etc/motd
Welcome to this server.
EOF

sudo echo "x" > /root/file 常常失败,因为重定向由当前 shell 完成。需要写 root 文件时,用 sudo tee 更稳。

13.6 循环和批量处理

1
2
3
4
5
$ for f in *.log; do echo "$f"; done       # 遍历当前目录所有 .log 文件
$ for f in *.jpg; do mv "$f" "${f%.jpg}.jpeg"; done # 批量把 .jpg 改成 .jpeg
$ while read -r line; do echo "$line"; done < list.txt # 逐行读取 list.txt
$ find . -type f -name "*.php" -exec chmod 644 {} \; # 批量设置 PHP 文件权限
$ find . -type d -exec chmod 755 {} \; # 批量设置目录权限

批量改名如果系统有 rename

1
2
$ rename 's/\.jpeg$/.jpg/' *.jpeg          # 批量把 .jpeg 后缀改成 .jpg
$ rename 'y/A-Z/a-z/' * # 批量把文件名大写转小写

13.7 脚本模板

1
2
3
4
5
6
7
8
#!/usr/bin/env bash
set -euo pipefail # 更严格的脚本错误处理

main() { # 主函数入口
echo "hello"
}

main "$@"

带日志和错误提示:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env bash
set -euo pipefail # 任何关键错误都让脚本退出

log() { # 带时间戳输出日志
printf '[%s] %s\n' "$(date '+%F %T')" "$*"
}

trap 'log "failed at line $LINENO"' ERR # 任意命令失败时提示出错行

log "start"
# commands here
log "done"

13.8 tmux / screen

1
2
3
4
5
sudo / root apt install tmux               # 安装终端复用工具 tmux
$ tmux new -s work # 创建会话
$ tmux ls # 列出会话
$ tmux attach -t work # 接回会话
$ tmux kill-session -t work # 关闭会话

tmux 默认快捷键前缀是 Ctrl+b

1
2
3
4
5
Ctrl+b d          离开会话,程序继续运行
Ctrl+b c 新建窗口
Ctrl+b n / p 下一个 / 上一个窗口
Ctrl+b % 左右分屏
Ctrl+b " 上下分屏

14. SSH、密钥与远程同步

14.1 SSH 登录

1
2
3
4
5
$ ssh user@host                         # 默认 22 端口
$ ssh user@host -p 2222 # 指定端口
$ ssh -i ~/.ssh/id_ed25519 user@host # 指定私钥
$ ssh -v user@host # 调试连接
$ ssh -vvv user@host # 更详细调试

14.2 生成 SSH 密钥

1
2
3
4
$ ssh-keygen -t ed25519 -C "your_email@example.com" # 生成推荐的 Ed25519 SSH 密钥
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 生成兼容性更好的 RSA 密钥
$ ls -lah ~/.ssh # 查看 SSH 密钥和配置文件
$ cat ~/.ssh/id_ed25519.pub # 打印公钥,复制到服务器或 Git 平台

权限建议:

1
2
3
4
$ chmod 700 ~/.ssh                       # 只有自己能访问 .ssh 目录
$ chmod 600 ~/.ssh/id_ed25519 # 私钥只能自己读写
$ chmod 644 ~/.ssh/id_ed25519.pub # 公钥允许其他用户读取
$ chmod 600 ~/.ssh/authorized_keys # 授权公钥文件只允许自己读写

14.3 复制公钥到服务器

1
2
$ ssh-copy-id user@host                   # 将本机公钥复制到远程服务器
$ ssh-copy-id -p 2222 user@host # 指定 SSH 端口复制公钥

没有 ssh-copy-id 时可手动追加:

1
$ cat ~/.ssh/id_ed25519.pub | ssh user@host 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys' # 手动追加公钥并修正权限

14.4 SSH 配置文件

~/.ssh/config 示例:

1
2
3
4
5
6
7
Host my-vps                              # 自定义连接别名
HostName 203.0.113.10 # 真实服务器 IP 或域名
User root # 默认登录用户
Port 22 # 默认 SSH 端口
IdentityFile ~/.ssh/id_ed25519 # 默认使用的私钥
ServerAliveInterval 30 # 每 30 秒发送保活包
ServerAliveCountMax 3 # 连续 3 次无响应后断开

使用:

1
2
$ ssh my-vps                             # 使用 SSH 配置别名登录
$ scp file.txt my-vps:/root/ # 通过别名复制文件到远程 /root

14.5 scp / sftp 传文件

1
2
3
4
5
$ scp file.txt user@host:/tmp/           # 上传文件到远程 /tmp
$ scp user@host:/tmp/file.txt ./ # 从远程下载文件到当前目录
$ scp -P 2222 file.txt user@host:/tmp/ # 指定端口上传文件
$ scp -r ./dir user@host:/tmp/ # 递归上传目录
$ sftp user@host # 进入交互式 SFTP 文件传输

14.6 SSH 隧道

本地端口转发:

1
2
$ ssh -L 8080:127.0.0.1:80 user@host     # 本地 8080 转发到远端 127.0.0.1:80
# 访问本机 127.0.0.1:8080,实际连接远端服务器的 127.0.0.1:80

远程端口转发:

1
2
$ ssh -R 9000:127.0.0.1:3000 user@host   # 远端 9000 转发回本机 127.0.0.1:3000
# 远端 127.0.0.1:9000 转回本机 127.0.0.1:3000

SOCKS 代理:

1
$ ssh -D 1080 user@host                  # 在本机开启 SOCKS5 代理端口 1080

14.7 ssh-agent

1
2
3
4
$ eval "$(ssh-agent -s)"                  # 启动 ssh-agent 并导入环境变量
$ ssh-add ~/.ssh/id_ed25519 # 把私钥加载到 agent
$ ssh-add -l # 查看已加载的密钥
$ ssh-add -D # 清空 agent 中的所有密钥

15. Docker / Compose 常用命令

15.1 镜像与容器

1
2
3
4
5
6
7
8
9
10
11
12
$ docker version                         # 查看 Docker 客户端和服务端版本
$ docker info # 查看 Docker 运行环境信息
$ docker images # 列出本地镜像
$ docker pull nginx:latest # 拉取 nginx 最新镜像
$ docker ps # 查看正在运行的容器
$ docker ps -a # 查看所有容器,包括已停止
$ docker run --name web -d -p 8080:80 nginx # 后台启动 nginx,并映射本机 8080 到容器 80
$ docker stop web # 停止 web 容器
$ docker start web # 启动已停止的 web 容器
$ docker restart web # 重启 web 容器
$ docker rm web # 删除已停止的 web 容器
$ docker rmi nginx:latest # 删除本地 nginx 镜像

15.2 日志、进入容器、复制文件

1
2
3
4
5
6
$ docker logs web                        # 查看 web 容器日志
$ docker logs -f --tail=100 web # 实时追踪最近 100 行日志
$ docker exec -it web bash # 进入容器 bash
$ docker exec -it web sh # 进入容器 sh,适合精简镜像
$ docker cp web:/etc/nginx/nginx.conf ./nginx.conf # 从容器复制文件到本机
$ docker cp ./index.html web:/usr/share/nginx/html/index.html # 从本机复制文件到容器

15.3 网络、卷与资源

1
2
3
4
5
6
$ docker network ls                      # 查看 Docker 网络
$ docker network inspect bridge # 查看 bridge 网络详情
$ docker volume ls # 查看 Docker 数据卷
$ docker volume inspect volume_name # 查看指定数据卷详情
$ docker stats # 实时查看容器资源占用
$ docker inspect web # 查看 web 容器完整配置和状态

15.4 清理

1
2
3
4
5
6
$ docker system df                       # 查看镜像、容器、卷占用空间
$ docker container prune # 清理已停止容器
$ docker image prune # 清理悬空镜像
$ docker volume prune # 清理未使用数据卷,谨慎
$ docker system prune # 清理未使用容器、网络、镜像缓存
$ docker system prune -a # 会删除未使用镜像,谨慎

15.5 Docker Compose

1
2
3
4
5
6
7
8
9
$ docker compose up -d                   # 后台启动 compose 项目
$ docker compose down # 停止并移除 compose 项目容器和网络
$ docker compose ps # 查看 compose 服务状态
$ docker compose logs -f # 实时查看所有服务日志
$ docker compose logs -f service # 实时查看指定服务日志
$ docker compose restart service # 重启指定服务
$ docker compose pull # 拉取 compose 文件中声明的镜像
$ docker compose up -d --build # 重新构建镜像并后台启动
$ docker compose exec service bash # 进入指定服务容器

16. Git 常用命令

16.1 基础流程

1
2
3
4
5
6
$ git status                            # 查看工作区和暂存区状态
$ git add file # 暂存指定文件
$ git add . # 暂存当前目录全部修改
$ git commit -m "message" # 创建提交
$ git pull # 拉取远程更新并合并
$ git push # 推送本地提交到远程

16.2 查看历史和差异

1
2
3
4
5
$ git log --oneline --graph --decorate --all # 图形化查看所有分支提交历史
$ git diff # 查看工作区未暂存差异
$ git diff --staged # 查看已暂存差异
$ git show HEAD # 查看最新提交内容
$ git blame file # 查看文件每行最后是谁改的

16.3 分支

1
2
3
4
5
6
$ git branch                            # 查看本地分支
$ git branch new-feature # 创建新分支但不切换
$ git switch new-feature # 切换到已有分支
$ git switch -c new-feature # 创建并切换到新分支
$ git merge main # 将 main 分支合并到当前分支
$ git branch -d old-feature # 删除已合并的本地分支

16.4 远程仓库

1
2
3
4
$ git remote -v                         # 查看远程仓库地址
$ git remote add origin git@github.com:user/repo.git # 添加 origin 远程仓库
$ git remote set-url origin git@github.com:user/repo.git # 修改 origin 地址
$ git fetch --all --prune # 拉取全部远程引用并清理失效分支

16.5 撤销常见操作

1
2
3
4
5
6
$ git restore file                     # 丢弃工作区修改
$ git restore --staged file # 取消暂存
$ git commit --amend # 修改上一次提交
$ git revert COMMIT # 生成一个反向提交,安全
$ git reset --soft HEAD~1 # 撤回提交,保留暂存
$ git reset --mixed HEAD~1 # 撤回提交,保留工作区

git reset --hard 会丢弃修改,使用前要非常确定。


17. Nginx / Web 服务常用排查

17.1 Nginx 服务

1
2
3
4
5
sudo / root nginx -t                    # 检查 Nginx 配置语法
sudo / root systemctl reload nginx # 平滑重载 Nginx 配置
sudo / root systemctl restart nginx # 重启 Nginx 服务
sudo / root systemctl status nginx # 查看 Nginx 服务状态
sudo / root journalctl -u nginx -n 100 --no-pager # 查看 Nginx 最近 100 行日志

查配置:

1
2
3
sudo / root nginx -T | less             # 输出完整 Nginx 配置并分页查看
sudo / root grep -R "server_name" /etc/nginx # 搜索站点域名配置
sudo / root grep -R "listen" /etc/nginx # 搜索监听端口配置

查日志:

1
2
3
4
$ tail -f /var/log/nginx/access.log     # 实时查看访问日志
$ tail -f /var/log/nginx/error.log # 实时查看错误日志
$ awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head # 统计访问最多的 IP
$ awk '$9 >= 500 {print $0}' /var/log/nginx/access.log | tail # 查看最近 5xx 错误请求

17.2 HTTP 状态和 TLS

1
2
3
4
5
$ curl -I http://example.com            # 查看 HTTP 响应头
$ curl -Ik https://example.com # 忽略证书错误查看 HTTPS 响应头
$ curl -L -I https://example.com # 跟随跳转查看最终响应头
$ openssl s_client -connect example.com:443 -servername example.com # 查看 TLS 握手和证书链
$ echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -issuer -subject # 查看证书有效期、颁发者和主体

17.3 常见 Web 问题定位

502 / 504:

1
2
3
4
sudo / root systemctl status php*-fpm   # 查看 PHP-FPM 服务状态
sudo / root ss -ltnp # 查看后端是否监听端口
$ tail -f /var/log/nginx/error.log # 实时查看 Nginx 错误日志
$ curl -I http://127.0.0.1:BACKEND_PORT # 从本机请求后端服务

证书问题:

1
2
3
$ date                                  # 确认本机时间是否正确
$ curl -Iv https://domain.com # 查看 HTTPS 连接和证书调试信息
$ openssl x509 -in cert.pem -noout -dates -subject -issuer # 查看本地证书信息

权限问题:

1
2
3
4
5
$ namei -l /var/www/site/index.html     # 逐级检查路径权限
$ ls -lah /var/www/site # 查看网站目录权限和所有者
sudo / root chown -R www-data:www-data /var/www/site # 递归修正网站目录所有者
sudo / root find /var/www/site -type d -exec chmod 755 {} \; # 设置目录权限
sudo / root find /var/www/site -type f -exec chmod 644 {} \; # 设置文件权限

18. 常见场景速查

18.1 新服务器初始化

1
2
3
4
5
6
7
8
9
10
sudo / root apt update                  # 更新软件源索引
sudo / root apt full-upgrade -y # 非交互完整升级系统
sudo / root apt install -y curl wget vim git htop tmux unzip zip ca-certificates gnupg lsb-release # 安装常用工具
sudo / root timedatectl set-timezone Asia/Shanghai # 设置中国时区
sudo / root adduser deploy # 创建部署用户
sudo / root usermod -aG sudo deploy # 允许 deploy 使用 sudo
sudo / root ufw allow 22/tcp # 放行 SSH
sudo / root ufw allow 80/tcp # 放行 HTTP
sudo / root ufw allow 443/tcp # 放行 HTTPS
sudo / root ufw enable # 启用防火墙

18.2 快速判断服务器是否正常

1
2
3
4
5
6
$ uptime                                # 查看运行时长和负载
$ free -h # 查看内存和 swap
$ df -h # 查看磁盘空间
$ ss -ltnp # 查看监听端口
sudo / root systemctl --failed # 查看失败服务
sudo / root journalctl -p err --since "1 hour ago" # 查看最近 1 小时错误日志

18.3 找出最占空间的目录和文件

1
2
3
4
5
$ df -h                                 # 先确认哪个分区满了
sudo / root du -xh / --max-depth=1 | sort -hr # 查看根目录一级占用排行
sudo / root du -xh /var --max-depth=1 | sort -hr # 查看 /var 一级占用排行
sudo / root find /var -type f -size +200M -print # 查找 /var 下大于 200M 的文件
sudo / root lsof +L1 # 查找已删除但仍占空间的文件

18.4 查某个端口为什么访问不了

1
2
3
4
5
sudo / root ss -ltnp | grep ':PORT'     # 查看目标端口是否监听
$ curl -I http://127.0.0.1:PORT # 从本机访问端口
$ nc -vz SERVER_IP PORT # 从当前机器测试远程端口连通性
sudo / root ufw status verbose # 查看防火墙是否放行
sudo / root journalctl -u service --since "30 minutes ago" # 看服务最近日志

18.5 查某个服务为什么启动失败

1
2
3
4
sudo / root systemctl status service --no-pager # 查看服务状态不分页
sudo / root journalctl -u service -n 200 --no-pager # 查看服务最近 200 行日志
sudo / root systemctl cat service # 查看服务 unit 配置
sudo / root systemctl daemon-reload # 修改 unit 后重载 systemd

18.6 安全清理旧日志

1
2
3
sudo / root find /var/log/myapp -type f -name "*.log" -mtime +14 -print # 先列出 14 天前日志
sudo / root find /var/log/myapp -type f -name "*.log" -mtime +14 -delete # 确认后删除旧日志
sudo / root journalctl --vacuum-time=14d # 清理 14 天前的 systemd 日志

18.7 备份网站目录

1
2
3
sudo / root mkdir -p /backup            # 创建备份目录
sudo / root tar -czf /backup/www-$(date +%F).tar.gz /var/www # 按日期打包网站目录
sudo / root find /backup -name "www-*.tar.gz" -mtime +7 -delete # 删除 7 天前备份

18.8 同步网站到远程服务器

1
$ rsync -avz --delete -e ssh ./public/ user@host:/var/www/site/ # 通过 SSH 镜像同步 public 内容

18.9 查看访问量最高的 IP 和 URL

1
2
3
$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 20 # 统计访问最多的 IP
$ awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -n 20 # 统计访问最多的 URL
$ awk '$9 >= 500 {print $7}' access.log | sort | uniq -c | sort -nr | head -n 20 # 统计 5xx 最多的 URL

18.10 快速生成随机密码

1
2
$ openssl rand -base64 24               # 生成 base64 随机密码
$ tr -dc 'A-Za-z0-9' </dev/urandom | head -c 24; echo # 生成 24 位纯字母数字密码

延伸阅读

建议将本文保存到团队 Wiki 或打印成小册,方便在服务器环境下快速查阅。