适用 :CentOS/RHEL 7+、Ubuntu/Debian 20+、AlmaLinux/RockyLinux 8+
Shell:Bash 5.x / Zsh 5.x
第一章:文件与目录操作
1.1 基础导航
| 命令 |
说明 |
示例 |
pwd |
显示当前工作目录(绝对路径) |
pwd → /home/user/projects |
pwd -P |
显示物理路径(解析所有符号链接) |
pwd -P |
cd [目录] |
切换目录 |
cd /var/log |
cd ~ 或 cd |
切换到当前用户的家目录 |
cd ~ |
cd - |
切换到上一次所在的目录 |
cd - |
ls [选项] [路径] |
列出目录内容 |
ls -la /etc |
ls -l |
长格式显示(权限/所有者/大小/时间) |
ls -l |
ls -la |
显示所有文件(含隐藏文件 . 开头) |
ls -la ~ |
ls -lh |
人类可读的文件大小(K/M/G) |
ls -lh /var/log |
ls -lt |
按修改时间倒序排列 |
ls -lt |
ls -lS |
按文件大小倒序排列 |
ls -lS /tmp |
ls -R |
递归列出子目录 |
ls -R /etc/nginx |
ls -i |
显示文件的 inode 号 |
ls -i /etc/passwd |
tree [目录] |
以树状结构显示目录(需安装) |
tree -L 2 /etc |
ls 输出字段解析:
-rw-r--r-- 1 root root 1.2K Jan 15 10:23 nginx.conf
│└┬┘└┬┘└┬┘ │ │ │ │ │ └── 文件名
│ │ │ │ │ │ │ │ └────────── 修改时间
│ │ │ │ │ │ │ └─────────────── 文件大小
│ │ │ │ │ │ └──────────────────── 所属组
│ │ │ │ │ └───────────────────────── 所有者
│ │ │ │ └──────────────────────────── 硬链接数
│ │ │ └──────────────────────────────── 其他人权限
│ │ └─────────────────────────────────── 所属组权限
│ └────────────────────────────────────── 所有者权限
└──────────────────────────────────────── 文件类型(-普通文件、d目录、l链接、c字符设备、b块设备、 s套接字、p管道)
1.2 文件与目录创建
| 命令 |
说明 |
示例 |
touch [文件] |
创建空文件 / 更新文件时间戳 |
touch app.log |
touch {a,b,c}.txt |
批量创建多个文件 |
创建 a.txt、b.txt、c.txt |
mkdir [目录] |
创建目录 |
mkdir backups |
mkdir -p [路径] |
递归创建(含父目录,不报错) |
mkdir -p /data/app/logs/2024 |
mkdir -m 750 [目录] |
创建时指定权限 |
mkdir -m 750 /data/private |
cp [源] [目标] |
复制文件 |
cp nginx.conf nginx.conf.bak |
cp -r [源] [目标] |
递归复制目录 |
cp -r /etc/nginx /backup/nginx-2024 |
cp -a [源] [目标] |
归档复制(保留所有属性、链接) |
cp -a /data/ /backup/data/ |
cp -v [源] [目标] |
显示复制过程 |
cp -v *.conf /backup/ |
cp --parents [源] [目标] |
保持目录结构复制 |
cp --parents /etc/nginx/nginx.conf /backup/ |
mv [源] [目标] |
移动文件/目录 |
mv oldname.txt newname.txt |
mv -f [源] [目标] |
强制覆盖 |
mv -f file1.txt file2.txt |
mv -n [源] [目标] |
不覆盖已存在文件 |
mv -n source.txt dest.txt |
ln -s [源] [链接名] |
创建符号链接(软链接) |
ln -s /data/logs /var/log/app |
ln [源] [链接名] |
创建硬链接 |
ln file.txt hardlink.txt |
readlink -f [链接] |
解析符号链接到最终目标 |
readlink -f /usr/bin/java |
1.3 删除操作
| 命令 |
说明 |
示例 |
rm [文件] |
删除文件 |
rm app.log |
rm -i [文件] |
删除前确认 |
rm -i important.txt |
rm -f [文件] |
强制删除(不确认) |
rm -f *.tmp |
rm -r [目录] |
递归删除目录 |
rm -r old_project/ |
rm -rf [目录] |
强制递归删除(高危!) |
rm -rf /tmp/build_cache/ |
rmdir [空目录] |
删除空目录 |
rmdir empty_dir/ |
rmdir -p [路径] |
递归删除空目录 |
rmdir -p a/b/c |
⚠️ 安全删除别名(建议加入 ~/.bashrc):
alias rm='rm -i' # 删除前确认
alias cp='cp -i' # 覆盖前确认
alias mv='mv -i' # 覆盖前确认
1.4 查看文件内容
| 命令 |
说明 |
示例 |
cat [文件] |
显示整个文件内容 |
cat /etc/passwd |
cat -n [文件] |
显示行号 |
cat -n app.log |
cat file1 file2 > file3 |
合并多个文件 |
cat a.log b.log > combined.log |
tac [文件] |
倒序显示(从最后一行开始) |
tac /var/log/syslog |
head [文件] |
显示前10行 |
head /var/log/nginx/access.log |
head -n 20 [文件] |
显示前20行 |
head -n 20 app.log |
head -c 1K [文件] |
显示前1KB |
head -c 1K data.bin |
tail [文件] |
显示最后10行 |
tail /var/log/syslog |
tail -n 50 [文件] |
显示最后50行 |
tail -n 50 app.log |
tail -f [文件] |
实时追踪文件新增内容 |
tail -f /var/log/nginx/access.log |
tail -F [文件] |
追踪(文件被旋转后仍追踪) |
tail -F /var/log/app.log |
tail -n 100 -f [文件] |
显示最后100行并持续追踪 |
tail -n 100 -f app.log |
more [文件] |
分页显示(只能向下翻页) |
more /var/log/syslog |
less [文件] |
分页显示(支持上下翻页/搜索) |
less /var/log/syslog |
less 操作键:
| 按键 |
功能 |
Space / f |
向下翻一页 |
b |
向上翻一页 |
↓ / j / Enter |
向下移一行 |
↑ / k |
向上移一行 |
g |
跳到文件开头 |
G |
跳到文件末尾 |
/pattern |
向下搜索 |
?pattern |
向上搜索 |
n |
下一个匹配 |
N |
上一个匹配 |
q |
退出 |
1.5 文件搜索
find(功能最强大的文件查找)
# 基础语法:find [路径] [表达式] [动作]
# 按名称搜索
find /etc -name "*.conf" # 精确匹配文件名(区分大小写)
find /etc -iname "*.conf" # 忽略大小写
find /etc -name "nginx.*" # 支持通配符
find /home -not -name "*.txt" # 排除匹配
# 按类型搜索
find /var/log -type f # 普通文件
find /var -type d # 目录
find /run -type l # 符号链接
# 按大小搜索
find /var/log -size +100M # 大于 100MB
find /var/log -size -1K # 小于 1KB
find /var/log -size 10M # 精确等于 10MB
find /var/log -size +1G -size -5G # 1GB 到 5GB 之间
# 按时间搜索
find /var/log -mtime -1 # 1 天内修改过的
find /var/log -mtime +7 # 7 天前修改的
find /var/log -atime +30 # 30 天前访问过的
find /tmp -ctime +7 # 7 天前状态变更的
find /var/log -mmin -60 # 1 小时内修改的
# 按权限搜索
find /etc -perm 644 # 精确权限 644
find /etc -perm /u=s # SUID 文件
# 按所有者搜索
find /home -user root # 属于 root 的文件
find /home -group developers # 属于 developers 组
# 执行动作
find /tmp -name "*.log" -delete # 删除匹配文件
find /var/log -name "*.log" -exec rm -f {} \; # 对每个匹配执行命令
find /var/log -name "*.log" -exec ls -lh {} \; # 列出匹配文件详情
find /etc -name "*.conf" | xargs grep -l "listen" # 管道传递给 xargs
find /var/log -size +100M -exec ls -lhS {} + | head -10 # 查找大文件并排序
locate(基于数据库的快速查找)
locate nginx.conf # 快速查找文件(需 updatedb)
locate -i nginx.conf # 忽略大小写
locate -r 'nginx.*\.conf$' # 正则匹配
# 更新 locate 数据库(通常由 cron 每日自动执行)
sudo updatedb
which / whereis / type(查找命令位置)
which nginx # 查找可执行文件路径($PATH)
which -a nginx # 查找所有匹配
whereis nginx # 查找二进制/源码/手册页位置
whereis -b nginx # 只查二进制
type ls # 显示命令类型(alias/builtin/file)
type -a ls # 显示所有匹配
第二章:文本处理三剑客
2.1 grep(文本过滤)
# 基础搜索
grep "error" app.log # 包含 "error" 的行
grep -i "error" app.log # 忽略大小写
grep -v "error" app.log # 不包含 "error" 的行
grep -n "error" app.log # 显示行号
grep -c "error" app.log # 统计匹配行数
grep -l "error" *.log # 只列出包含匹配的文件名
grep -L "error" *.log # 列出不包含匹配的文件名
# 正则表达式
grep "^2024-01" app.log # 以 2024-01 开头
grep "500$" app.log # 以 500 结尾
grep -E "4[0-9]{2}" app.log # 400-499(扩展正则)
grep -P "\b\d{3}\b" app.log # Perl 正则,匹配三位数字
grep -w "error" app.log # 匹配完整单词(不是 substring)
# 上下文
gep -C 3 "Exception" app.log # 显示匹配行前后 3 行
grep -B 5 "Exception" app.log # 显示匹配行前 5 行
grep -A 5 "Exception" app.log # 显示匹配行后 5 行
# 多条件
grep -E "ERROR|WARN|FATAL" app.log # 匹配任一模式
grep "error" app.log | grep -v "debug" # 管道组合(含 error 但不含 debug)
# 递归搜索
grep -r "listen 80" /etc/nginx/ # 递归目录搜索
grep -ri "database_url" /etc/ # 递归 + 忽略大小写
# 实用组合
# 统计各 IP 访问次数
grep -oP '\d+\.\d+\.\d+\.\d+' access.log | sort | uniq -c | sort -rn | head
2.2 sed(流编辑器)
# 基本语法:sed [选项] '命令' 文件
# 替换(s/旧/新/标志)
sed 's/foo/bar/' file.txt # 每行第一个 foo 替换为 bar
sed 's/foo/bar/g' file.txt # 全局替换
sed 's/foo/bar/2' file.txt # 替换每行第2个匹配
sed 's/foo/bar/2g' file.txt # 从第2个开始全部替换
sed 's|/usr/local|/opt|g' file.txt # 使用 | 作为分隔符(避免转义/)
sed -i 's/foo/bar/g' file.txt # 直接修改文件(原地编辑)
sed -i.bak 's/foo/bar/g' file.txt # 修改前备份为 file.txt.bak
# 删除行
sed '3d' file.txt # 删除第3行
sed '2,5d' file.txt # 删除 2-5 行
sed '/^$/d' file.txt # 删除空行
sed '/^#/d' file.txt # 删除注释行(以#开头)
sed '/^$/d;/^#/d' file.txt # 删除空行和注释行
# 打印行
sed -n '5p' file.txt # 只打印第5行
sed -n '10,20p' file.txt # 打印 10-20 行
sed -n '/pattern/p' file.txt # 打印匹配行(等价于 grep)
# 插入/追加
sed '2i\# This is inserted' file.txt # 在第2行前插入
sed '$a\# This is appended' file.txt # 在文件末尾追加
# 高级替换
sed 's/^\[.*\] \[ERROR\] //g' app.log # 删除日志前缀
sed -E 's/([0-9]+)\.([0-9]+)/\2.\1/' # 交换两组数字(扩展正则)
# 从管道读取
cat file.txt | sed 's/foo/bar/g'
df -h | sed -n '2p' # 只显示 df 的第二行
2.3 awk(文本分析处理)
# 基本语法:awk '模式 {动作}' 文件
# 默认按空白字符分割字段,$1 表示第1个字段,$0 表示整行
# 打印指定列
awk '{print $1}' file.txt # 打印第1列
awk '{print $1, $3}' file.txt # 打印第1和第3列
awk '{print $NF}' file.txt # 打印最后一列
awk -F: '{print $1}' /etc/passwd # 指定分隔符为 :
awk -F',' '{print $2}' data.csv # CSV 第2列
# 条件过滤
awk '$3 > 100 {print $0}' file.txt # 第3列大于100的行
awk '$2 == "ERROR" {print $0}' log.txt # 第2列等于 ERROR
awk '/pattern/ {print $0}' file.txt # 匹配正则
awk '$1 ~ /^2024/ {print}' log.txt # 第1列以 2024 开头
# 内置变量
awk '{print NR, $0}' file.txt # NR=行号,打印带行号
awk 'END {print NR}' file.txt # 统计总行数
awk '{print FNR, $0}' file1 file2 # FNR=各文件的行号
awk '{print NF}' file.txt # NF=每行的字段数
# 计算
awk '{sum += $3} END {print sum}' file.txt # 求第3列总和
awk '{sum += $3} END {print "Average:", sum/NR}' file.txt
awk '$3 > max {max=$3; line=$0} END {print max, line}' file.txt # 最大值行
# BEGIN/END 块
awk 'BEGIN {print "Start Processing"} {print $1} END {print "Done"}' file.txt
# 关联数组(计数)
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log
# 格式化输出
awk '{printf "%-15s %10d\n", $1, $3}' file.txt # 左对齐15字符 + 右对齐10数字
# 实用组合:统计磁盘使用
df -h | awk 'NR>1 {sum+=$3} END {print "Total used: " sum/1024/1024/1024 " GB"}'
2.4 其他文本工具
| 命令 |
说明 |
示例 |
sort |
排序 |
sort -t: -k3 -n /etc/passwd(按第3列数字排序) |
sort -r |
倒序 |
`ls -lS /tmp |
sort -u |
排序并去重 |
sort -u names.txt |
uniq |
去重(相邻行) |
`sort file.txt |
uniq -c |
去重并计数 |
`sort file.txt |
uniq -d |
只显示重复行 |
`sort file.txt |
wc -l |
统计行数 |
wc -l /etc/passwd |
wc -w |
统计单词数 |
wc -w essay.txt |
wc -c |
统计字节数 |
wc -c file.bin |
cut -d: -f1 |
按分隔符截取字段 |
cut -d: -f1,3 /etc/passwd |
cut -c1-10 |
按字符位置截取 |
cut -c1-10 file.txt |
tr 'a-z' 'A-Z' |
字符转换 |
`echo "hello" |
tr -d ' ' |
删除字符 |
`echo "a b c" |
tr -s ' ' |
压缩连续字符 |
`echo "a b c" |
paste file1 file2 |
合并文件(并行拼接) |
paste -d',' a.txt b.txt |
diff file1 file2 |
文件差异对比 |
diff -u config.old config.new |
colordiff |
彩色差异显示 |
colordiff file1 file2 |
comm file1 file2 |
两文件交集/差集 |
comm -12 sorted1 sorted2 |
第三章:文件权限与所有权
3.1 权限管理
| 命令 |
说明 |
示例 |
chmod [模式] [文件] |
修改权限 |
chmod 755 script.sh |
chmod u+x file |
给所有者添加执行权限 |
chmod u+x deploy.sh |
chmod go-w file |
去除组和其他人的写权限 |
chmod go-w config.yml |
chmod -R 755 [目录] |
递归修改权限 |
chmod -R 755 /data/app |
chmod +x *.sh |
给所有 .sh 文件添加执行权限 |
chmod +x /usr/local/bin/*.sh |
chown [用户:组] [文件] |
修改所有者 |
chown nginx:nginx /var/log/nginx |
chown -R user:group [目录] |
递归修改 |
chown -R appuser:appgroup /data/app |
chgrp [组] [文件] |
只修改所属组 |
chgrp wheel /usr/local/bin/script |
数字权限模式:
| 数字 |
权限 |
说明 |
| 7 |
rwx |
读+写+执行 |
| 6 |
rw- |
读+写 |
| 5 |
r-x |
读+执行 |
| 4 |
r-- |
只读 |
| 0 |
--- |
无权限 |
常用组合:
755 = rwxr-xr-x(脚本/目录)
644 = rw-r--r--(普通文件)
700 = rwx------(私有文件)
750 = rwxr-x---(组内共享)
777 = rwxrwxrwx(开放权限,尽量避免)
3.2 特殊权限
| 权限 |
命令 |
说明 |
| SUID (4000) |
chmod u+s /usr/bin/passwd |
以文件所有者权限执行 |
| SGID (2000) |
chmod g+s /shared/dir |
在目录中创建的文件继承组 |
| Sticky (1000) |
chmod +t /tmp |
只有所有者才能删除自己的文件 |
# 查找具有 SUID 的文件(安全检查)
find / -perm -4000 -type f 2>/dev/null
# 查找具有 SGID 的文件
find / -perm -2000 -type f 2>/dev/null
3.3 ACL(访问控制列表)
# 安装:sudo apt install acl / sudo yum install acl
getfacl file.txt # 查看 ACL
setfacl -m u:username:rw file.txt # 给用户添加读写权限
setfacl -m g:groupname:r file.txt # 给组添加读权限
setfacl -x u:username file.txt # 删除用户的 ACL
setfacl -b file.txt # 清除所有 ACL
setfacl -R -m d:u:username:rx /data # 递归 + 默认 ACL
第四章:磁盘与文件系统管理
4.1 磁盘空间查看
| 命令 |
说明 |
示例 |
df -h |
查看文件系统磁盘使用(人类可读) |
df -h |
df -hT |
显示文件系统类型 |
df -hT |
df -h / |
查看指定挂载点 |
df -h /var |
df -i |
查看 inode 使用情况 |
df -i |
du -sh [目录] |
查看目录总大小 |
du -sh /var/log |
du -sh * |
查看当前目录各子项大小 |
`du -sh * |
du -h --max-depth=1 [目录] |
查看一级子目录大小 |
du -h --max-depth=1 /var |
| `du -ah [目录] |
sort -rh |
head -20` |
ncdu [目录] |
交互式磁盘分析(需安装) |
ncdu /var |
4.2 文件系统操作
# 查看已挂载的文件系统
cat /proc/mounts
mount | grep ext4
# 查看块设备
lsblk
lsblk -f # 显示文件系统类型和 UUID
# 查看分区表
fdisk -l /dev/sda # MBR/GPT 分区表
parted -l # 所有磁盘分区
# 创建文件系统
mkfs.ext4 /dev/sdb1 # 格式化为 ext4
mkfs.xfs /dev/sdb1 # 格式化为 xfs
mkswap /dev/sdb2 # 创建 swap
# 挂载
mount /dev/sdb1 /mnt/data # 临时挂载
mount -a # 挂载 /etc/fstab 中所有条目
mount -o remount,rw / # 重新挂载根目录为可读写
# 卸载
umount /mnt/data # 卸载挂载点
umount /dev/sdb1 # 卸载设备
fuser -m /mnt/data # 查看占用挂载点的进程
# 查看 UUID
blkid
blkid /dev/sda1
# 自动挂载配置(/etc/fstab)
# UUID=xxxxx /data ext4 defaults,noatime,nodiratime 0 2
4.3 LVM(逻辑卷管理)
# 查看 PV/VG/LV
pvs # 物理卷
vgs # 卷组
lvs # 逻辑卷
lvdisplay # 详细信息
# 扩展逻辑卷
lvextend -L +10G /dev/vg0/data # 增加 10GB
lvextend -l +100%FREE /dev/vg0/data # 使用所有剩余空间
resize2fs /dev/vg0/data # 扩展 ext4 文件系统
xfs_growfs /dev/vg0/data # 扩展 xfs 文件系统
# 创建快照(备份前)
lvcreate -L 5G -s -n data_snap /dev/vg0/data
4.4 磁盘 I/O 监控
| 命令 |
说明 |
示例 |
iostat -x 1 |
扩展磁盘 I/O 统计(每秒刷新) |
iostat -x 1 5 |
iostat -d |
只显示设备 I/O |
iostat -d 2 |
iotop |
按进程显示 I/O 使用(需 root) |
sudo iotop |
vmstat -d |
磁盘统计摘要 |
vmstat -d 1 |
第五章:进程管理
5.1 进程查看
| 命令 |
说明 |
示例 |
ps aux |
显示所有进程详细信息 |
ps aux |
ps -ef |
全格式显示所有进程 |
ps -ef |
| `ps aux |
grep nginx` |
查找特定进程 |
| `ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu |
head` |
自定义输出列 |
pgrep nginx |
按名称查找 PID |
pgrep -a nginx(显示命令行) |
pgrep -u root sshd |
按用户和名称查找 |
pgrep -u root sshd |
pidof nginx |
查找进程 PID |
pidof sshd |
pstree |
以树状显示进程关系 |
pstree -p(显示 PID) |
top |
动态进程监控 |
top |
htop |
增强版 top(需安装) |
htop |
ps 状态码:
| 状态 |
说明 |
R |
运行中(Running) |
S |
睡眠中(Sleeping,可中断) |
D |
不可中断睡眠( usually I/O) |
T |
已停止(Stopped) |
Z |
僵尸进程(Zombie) |
< |
高优先级 |
N |
低优先级 |
+ |
前台进程 |
l |
多线程 |
5.2 top 操作指南
| 按键 |
功能 |
M |
按内存排序 |
P |
按 CPU 排序 |
T |
按运行时间排序 |
k |
输入 PID 杀死进程 |
r |
修改进程优先级(renice) |
c |
显示完整命令行 |
1 |
显示各 CPU 核心使用情况 |
d [秒] |
修改刷新间隔 |
W |
保存当前配置到 ~/.toprc |
q |
退出 |
h |
帮助 |
5.3 进程控制
# 前台/后台运行
command & # 后台运行
Ctrl + Z # 暂停前台进程
bg # 将暂停的进程放入后台
fg # 将后台进程调至前台
fg %1 # 将作业号1调至前台
jobs # 查看当前会话的后台任务
# 终止进程
kill PID # 发送 SIGTERM(优雅终止)
kill -9 PID # 发送 SIGKILL(强制终止)
kill -HUP PID # 发送 SIGHUP(重载配置)
killall nginx # 按名称杀死所有匹配进程
pkill nginx # 按名称模式杀死进程
pkill -f "java -jar app.jar" # 匹配完整命令行
pkill -u username # 杀死某用户的所有进程
# 优先级调整
nice -n 10 command # 以低优先级启动(10是较低优先级)
renice -n 5 -p PID # 修改运行中进程的优先级
renice -n -5 -p PID # 提升优先级(需要 root)
# nohup:用户退出后进程继续运行
nohup java -jar app.jar & # 后台运行,忽略 HUP 信号
nohup ./script.sh > output.log 2>&1 & # 输出重定向
5.4 systemd 服务管理
# 服务控制
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl reload nginx # 重载配置(不中断服务)
systemctl status nginx # 查看状态
systemctl enable nginx # 开机自启
systemctl disable nginx # 禁用自启
systemctl is-active nginx # 检查是否运行中
systemctl is-enabled nginx # 检查是否开机自启
# 查看所有服务
systemctl list-units --type=service --state=running # 运行中的服务
systemctl list-unit-files --type=service --state=enabled # 开机自启的服务
systemctl --failed # 查看失败的服务
# 日志查看(journalctl)
journalctl -u nginx # 查看 nginx 服务日志
journalctl -u nginx -f # 实时追踪
journalctl -u nginx --since "2024-01-15 10:00" --until "2024-01-15 12:00"
journalctl -u nginx -n 100 # 最后 100 行
journalctl -u nginx --no-pager # 直接输出,不分页
journalctl --disk-usage # 日志占用的磁盘空间
journalctl --vacuum-time=7d # 保留最近 7 天的日志
journalctl -p err # 只显示错误级别以上的日志
# 服务文件位置
/etc/systemd/system/ # 自定义服务
/lib/systemd/system/ # 系统服务
/usr/lib/systemd/system/ # 包安装的服务
# 重新加载 systemd(修改服务文件后)
systemctl daemon-reload
第六章:网络管理
6.1 网络配置查看
| 命令 |
说明 |
示例 |
ip addr |
查看 IP 地址(替代 ifconfig) |
ip addr |
ip addr show eth0 |
查看指定网卡 |
ip addr show dev eth0 |
ip link |
查看链路状态 |
ip link show |
ip -s link |
查看网卡统计 |
ip -s link show eth0 |
ip route |
查看路由表 |
ip route |
ip route get 8.8.8.8 |
查看到目标的路由 |
ip route get 8.8.8.8 |
ip neigh |
查看 ARP 表 |
ip neigh |
ss -tlnp |
查看监听端口(替代 netstat) |
ss -tlnp |
ss -tnp |
查看 TCP 连接 |
ss -tnp |
| `ss -tlnp |
grep :80` |
查看 80 端口 |
ss -s |
连接统计摘要 |
ss -s |
ss 选项说明:
-t TCP / -u UDP / -x Unix socket
-l 监听 / -a 所有
-n 显示数字端口(不解析服务名)
-p 显示进程信息(需要 root)
6.2 网络诊断
# ping:测试连通性
ping 8.8.8.8 # 持续 ping(Ctrl+C 停止)
ping -c 4 google.com # 只发送 4 个包
ping -i 0.5 192.168.1.1 # 每 0.5 秒发送一次
# traceroute:追踪路由路径
traceroute google.com # UDP 模式
traceroute -I google.com # ICMP 模式
tracepath google.com # 无需 root,自动发现 MTU
mtr google.com # 实时 traceroute(交互式)
# curl:HTTP 请求测试
curl -I https://example.com # 只显示响应头
curl -v https://example.com # 详细模式(含握手过程)
curl -o file.zip https://example.com/file.zip # 下载文件
curl -L https://t.co/xxx # 跟随重定向
curl -H "Authorization: Bearer token" https://api.example.com/data
curl -X POST -d '{"key":"value"}' -H "Content-Type: application/json" https://api.example.com
curl -k https://self-signed.example.com # 忽略证书验证
curl --resolve example.com:443:192.168.1.10 https://example.com # 指定解析 IP
# wget:文件下载
wget https://example.com/file.tar.gz
wget -O custom_name.tar.gz https://example.com/file.tar.gz
wget -c https://example.com/large_file.iso # 断点续传
wget --limit-rate=1m https://example.com/file # 限速 1MB/s
# nslookup / dig:DNS 查询
nslookup google.com
dig google.com # 详细信息
dig @8.8.8.8 google.com # 指定 DNS 服务器
dig +trace google.com # 追踪完整解析链
dig -x 8.8.8.8 # 反向 DNS 查询
# telnet / nc:端口连通性测试
telnet 192.168.1.10 3306 # 测试 3306 端口
timeout 3 bash -c 'cat < /dev/null > /dev/tcp/192.168.1.10/3306' # Bash 原生测试
nc -zv 192.168.1.10 80 443 # 扫描多个端口
nc -zv -w 3 192.168.1.10 1-1000 # 扫描端口范围
# whois:域名注册信息
whois example.com
6.3 防火墙
# firewalld(CentOS/RHEL)
firewall-cmd --state # 查看状态
firewall-cmd --list-all # 查看所有规则
firewall-cmd --list-ports # 查看开放端口
firewall-cmd --list-services # 查看开放服务
firewall-cmd --add-port=8080/tcp # 临时开放 8080
firewall-cmd --add-port=8080/tcp --permanent # 永久开放
firewall-cmd --remove-port=8080/tcp --permanent # 永久移除
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --reload # 重载规则
# ufw(Ubuntu/Debian)
ufw status # 查看状态
ufw enable # 启用
ufw disable # 禁用
ufw default deny incoming # 默认拒绝入站
ufw default allow outgoing # 默认允许出站
ufw allow 22/tcp # 开放 SSH
ufw allow 80/tcp # 开放 HTTP
ufw allow 443/tcp # 开放 HTTPS
ufw allow from 192.168.1.0/24 to any port 3306 # 允许特定网段访问 3306
ufw delete allow 8080 # 删除规则
ufw status numbered # 显示带编号的规则
ufw delete 3 # 删除编号3的规则
# iptables(底层,所有防火墙最终都调用它)
iptables -L -n -v # 列出所有规则
iptables -L -n --line-numbers # 带行号
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立的连接
iptables -P INPUT DROP # 默认丢弃入站
iptables -D INPUT 3 # 删除 INPUT 链第3条规则
iptables -F # 清空所有规则
6.4 网络抓包
# tcpdump(需要 root)
sudo tcpdump -i eth0 # 抓取 eth0 所有流量
sudo tcpdump -i eth0 port 80 # 只抓 80 端口
sudo tcpdump -i eth0 host 192.168.1.10 # 只抓特定 IP
sudo tcpdump -i eth0 tcp port 3306 -w capture.pcap # 保存到文件
sudo tcpdump -nn -i eth0 port 443 and host 10.0.0.5 # 组合条件
sudo tcpdump -r capture.pcap # 读取抓包文件
sudo tcpdump -i eth0 -c 100 -w - | strings # 提取明文内容
# tshark(Wireshark CLI)
sudo tshark -i eth0 -f "tcp port 80"
sudo tshark -r capture.pcap -Y "http.request"
第七章:用户与权限管理
7.1 用户管理
| 命令 |
说明 |
示例 |
useradd [用户名] |
创建用户 |
sudo useradd -m -s /bin/bash john |
useradd -r [用户名] |
创建系统用户 |
sudo useradd -r nginx |
userdel [用户名] |
删除用户 |
sudo userdel john |
userdel -r [用户名] |
删除用户及其家目录 |
sudo userdel -r john |
usermod -aG [组] [用户] |
将用户添加到附加组 |
sudo usermod -aG docker john |
usermod -s /bin/zsh [用户] |
修改用户 shell |
sudo usermod -s /bin/zsh john |
passwd [用户] |
修改密码 |
sudo passwd john |
chage -l [用户] |
查看密码过期信息 |
sudo chage -l john |
id [用户] |
查看用户 ID 和组 |
id john |
whoami |
显示当前用户名 |
whoami |
who |
显示已登录用户 |
who |
w |
显示已登录用户及活动 |
w |
last |
显示最近登录记录 |
last |
lastb |
显示失败登录尝试 |
sudo lastb |
# 创建用户(完整示例)
sudo useradd -m -s /bin/bash -G sudo,developers -c "John Developer" john
# -m: 创建家目录 -s: 指定 shell -G: 附加组 -c: 注释
sudo passwd john
# 锁定/解锁用户
sudo passwd -l john # 锁定
sudo passwd -u john # 解锁
7.2 用户组管理
| 命令 |
说明 |
示例 |
groupadd [组名] |
创建组 |
sudo groupadd developers |
groupdel [组名] |
删除组 |
sudo groupdel developers |
groupmod -n [新名] [旧名] |
重命名组 |
sudo groupmod -n devs developers |
gpasswd -a [用户] [组] |
添加用户到组 |
sudo gpasswd -a john developers |
gpasswd -d [用户] [组] |
从组中移除用户 |
sudo gpasswd -d john developers |
groups [用户] |
查看用户所属组 |
groups john |
getent group [组名] |
查看组成员 |
getent group developers |
7.3 sudo 权限
# 编辑 sudo 配置
sudo visudo # 安全编辑 /etc/sudoers
# /etc/sudoers 配置示例
# 用户权限
john ALL=(ALL:ALL) ALL # john 可以执行所有命令
john ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx # 免密执行特定命令
# 组权限
%developers ALL=(ALL) ALL # developers 组的所有用户
# 查看当前用户的 sudo 权限
sudo -l
第八章:压缩与归档
8.1 tar(归档)
# 创建归档
tar -cvf archive.tar /data/app # 创建 tar 归档(仅打包,不压缩)
tar -czvf archive.tar.gz /data/app # 创建 gzip 压缩归档(.tar.gz / .tgz)
tar -cjvf archive.tar.bz2 /data/app # 创建 bzip2 压缩归档
tar -cJvf archive.tar.xz /data/app # 创建 xz 压缩归档(最高压缩率)
# 选项说明:
# -c 创建 -x 解压 -t 列出内容
# -v 详细 -f 指定文件名
# -z gzip -j bzip2 -J xz
# -p 保留权限 --exclude=PATTERN 排除文件
# 解压归档
tar -xvf archive.tar # 解压 tar
tar -xzvf archive.tar.gz # 解压 gzip
tar -xjvf archive.tar.bz2 # 解压 bzip2
tar -xJvf archive.tar.xz # 解压 xz
tar -xzvf archive.tar.gz -C /target/dir # 解压到指定目录
tar -xzvf archive.tar.gz path/inside # 只提取归档内的某个路径
# 列出归档内容
tar -tzvf archive.tar.gz # 列出 gzip 归档内容
# 排除文件
tar -czvf backup.tar.gz /data --exclude='*.log' --exclude='/data/tmp'
# 增量备份
tar -czvf backup-$(date +%Y%m%d).tar.gz --listed-incremental=/var/log/tar.snapshot /data
8.2 压缩工具
| 命令 |
说明 |
示例 |
gzip [文件] |
gzip 压缩(替换原文件) |
gzip app.log |
gzip -d [文件] |
gzip 解压 |
gzip -d app.log.gz |
gunzip [文件] |
同 gzip -d |
gunzip app.log.gz |
zcat [文件] |
查看压缩文件内容 |
zcat app.log.gz |
bzip2 [文件] |
bzip2 压缩 |
bzip2 app.log |
bunzip2 [文件] |
bzip2 解压 |
bunzip2 app.log.bz2 |
xz [文件] |
xz 压缩(最高压缩率) |
xz app.log |
unxz [文件] |
xz 解压 |
unxz app.log.xz |
zip -r [压缩包] [目录] |
zip 压缩 |
zip -r backup.zip /data/app |
unzip [压缩包] |
zip 解压 |
unzip backup.zip |
unzip -l [压缩包] |
列出 zip 内容 |
unzip -l backup.zip |
unzip [压缩包] -d [目录] |
解压到指定目录 |
unzip backup.zip -d /data/restore |
8.3 dd(底层数据复制)
# 创建指定大小的空文件
dd if=/dev/zero of=file.bin bs=1M count=100 # 100MB 空文件
dd if=/dev/urandom of=random.bin bs=1K count=10 # 10KB 随机数据
# 备份磁盘
dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
# 恢复磁盘
dd if=/backup/sda.img of=/dev/sda bs=4M status=progress
# 制作启动盘
dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=fsync
# 擦除磁盘
dd if=/dev/urandom of=/dev/sda bs=4M status=progress
第九章:系统监控与性能分析
9.1 系统资源概览
| 命令 |
说明 |
示例 |
free -h |
内存使用情况 |
free -h |
free -m |
以 MB 显示 |
free -m |
uptime |
系统运行时间、负载 |
uptime |
vmstat 1 5 |
系统整体统计(1秒刷新,共5次) |
vmstat 1 5 |
vmstat -s |
统计摘要 |
vmstat -s |
mpstat -P ALL 1 |
各 CPU 核心使用率 |
mpstat -P ALL 1 |
sar -u 1 5 |
CPU 使用率历史 |
sar -u 1 5 |
sar -r 1 5 |
内存使用率历史 |
sar -r 1 5 |
sar -d 1 5 |
磁盘 I/O 历史 |
sar -d 1 5 |
dmesg |
内核环缓冲消息 |
`dmesg |
dmesg -T |
带时间戳 |
`dmesg -T |
watch -n 1 'free -h' |
每隔1秒执行命令 |
watch -n 1 'df -h' |
9.2 CPU 分析
# 查看 CPU 信息
lscpu # CPU 架构/核心/线程数
cat /proc/cpuinfo # 详细 CPU 信息
cat /proc/loadavg # 1/5/15 分钟负载
# 进程级 CPU 分析
perf top # 实时热点函数分析(需 root)
perf record -g ./program # 记录程序性能
perf report # 分析报告
# strace:跟踪系统调用
strace -p PID # 跟踪进程系统调用
strace -c -p PID # 统计各系统调用次数
strace -e trace=open,read,write ./program # 只跟踪特定调用
# lsof:查看进程打开的文件
lsof -p PID # 查看进程打开的文件
lsof -i :80 # 查看占用 80 端口的进程
lsof +D /var/log # 查看占用目录的进程
9.3 内存分析
# 内存详细信息
cat /proc/meminfo # 内核内存统计
smem -r # PSS(比例集大小,更准确的内存占用)
# 进程内存
pmap PID # 进程内存映射
pmap -x PID # 扩展格式(含 RSS/Dirty)
# OOM 排查
dmesg | grep -i "out of memory" # 查看 OOM 记录
cat /var/log/messages | grep "Out of memory"
journalctl -k | grep "Out of memory" # systemd 系统
9.4 综合监控工具
# glances(推荐)
glances # 全能系统监控(CPU/内存/磁盘/网络/进程)
glances --export csv # 导出为 CSV
# nmon
nmon # IBM 出品,按键切换视图
# atop
sudo atop # 记录历史性能数据,事后分析
atop -r /var/log/atop/atop_20240115 # 读取历史文件
# bcc/BPF(高级,内核级追踪)
sudo biolatency # 块 I/O 延迟分布
sudo execsnoop # 追踪新进程创建
sudo opensnoop # 追踪文件打开
sudo tcplife # 追踪 TCP 连接生命周期
第十章:定时任务(crontab)
10.1 crontab 语法
# 格式: 分 时 日 月 周 命令
# 范围: 0-59 0-23 1-31 1-12 0-7(0和7都是周日)
* * * * * command # 每分钟执行
*/5 * * * * command # 每5分钟执行
0 * * * * command # 每小时执行
0 0 * * * command # 每天0点执行
0 2 * * * command # 每天2点执行
0 0 * * 0 command # 每周日执行
0 0 1 * * command # 每月1日执行
0 0 1 1 * command # 每年1月1日执行
0 9-18 * * 1-5 command # 工作日 9-18 点每小时执行
0,30 * * * * command # 每小时的 0 分和 30 分执行
# 特殊字符串
@reboot command # 系统启动时执行
@yearly command # 每年1月1日 0:00(同 0 0 1 1 *)
@monthly command # 每月1日 0:00
@weekly command # 每周日 0:00
@daily command # 每天 0:00
@hourly command # 每小时 0 分
10.2 crontab 管理
crontab -l # 列出当前用户的定时任务
crontab -e # 编辑定时任务
crontab -r # 删除所有定时任务(慎用)
crontab file.txt # 从文件导入定时任务
sudo crontab -u www-data -l # 查看其他用户的定时任务
# 系统级定时任务(/etc/crontab)
cat /etc/crontab
# 预定义目录(放入脚本即可,无需编辑 crontab)
/etc/cron.hourly/ # 每小时执行
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行
# 日志
grep CRON /var/log/syslog # Debian/Ubuntu
grep CRON /var/log/cron # CentOS/RHEL
# 环境变量(crontab 中的 PATH 通常很精简,建议显式设置)
# 在 crontab 文件顶部添加:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="admin@example.com"
第十一章:SSH 远程管理
11.1 SSH 基础
# 连接远程主机
ssh user@192.168.1.10
ssh -p 2222 user@192.168.1.10 # 指定端口
ssh -i ~/.ssh/id_rsa user@host # 指定私钥
ssh -v user@host # 调试模式(排查连接问题)
ssh -vvv user@host # 更详细的调试
# 执行远程命令(不登录)
ssh user@host "ls -la /var/log"
ssh user@host "sudo systemctl restart nginx"
# 复制文件(scp)
scp file.txt user@host:/remote/path/ # 本地 → 远程
scp user@host:/remote/file.txt ./local/ # 远程 → 本地
scp -r /local/dir user@host:/remote/path/ # 递归目录
scp -P 2222 file.txt user@host:/path/ # 指定端口
scp -i ~/.ssh/key file.txt user@host:/path/ # 指定密钥
# rsync(增量同步,更高效)
rsync -avz /local/data/ user@host:/remote/data/ # 同步目录
rsync -avz --delete /local/data/ user@host:/remote/data/ # 删除远程多余文件
rsync -avz --exclude='*.log' /data/ user@host:/backup/ # 排除文件
rsync -avz --progress /bigfile.iso user@host:/data/ # 显示进度
rsync -avz -e "ssh -p 2222" /data/ user@host:/backup/ # 指定 SSH 端口
11.2 SSH 密钥管理
# 生成密钥对
ssh-keygen -t ed25519 -C "comment" # 推荐算法(ed25519)
ssh-keygen -t rsa -b 4096 -C "comment" # RSA 4096
ssh-keygen -f ~/.ssh/my_key # 指定文件名
ssh-keygen -p -f ~/.ssh/id_rsa # 修改私钥密码
# 复制公钥到远程主机(免密登录)
ssh-copy-id user@host
ssh-copy-id -i ~/.ssh/my_key.pub user@host
# 手动添加公钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# SSH Agent(管理多个密钥)
eval $(ssh-agent -s) # 启动 agent
ssh-add ~/.ssh/id_rsa # 添加密钥
ssh-add -l # 列出已添加的密钥
ssh-add -D # 清除所有密钥
# SSH 配置(~/.ssh/config)
Host myserver
HostName 192.168.1.10
User admin
Port 2222
IdentityFile ~/.ssh/my_key
ServerAliveInterval 60
# 使用配置连接
ssh myserver # 等价于 ssh -p 2222 -i ~/.ssh/my_key admin@192.168.1.10
11.3 SSH 隧道
# 本地端口转发:将本地端口映射到远程主机的端口
# 访问 localhost:8080 → 相当于访问 remote-server:80
ssh -L 8080:remote-server:80 user@jump-host
# 远程端口转发:将远程主机的端口映射到本地
# 在 remote-server 上访问 remote-server:9090 → 相当于访问 localhost:3000
ssh -R 9090:localhost:3000 user@remote-server
# 动态 SOCKS 代理
ssh -D 1080 user@vps-server # 本地 1080 端口成为 SOCKS5 代理
# 后台保持隧道
ssh -fN -L 8080:remote:80 user@jump-host # -f 后台运行 -N 不执行远程命令
第十二章:实用技巧与快捷键
12.1 Bash 快捷键
| 快捷键 |
功能 |
Ctrl + A |
光标移到行首 |
Ctrl + E |
光标移到行尾 |
Ctrl + U |
删除光标前所有字符 |
Ctrl + K |
删除光标后所有字符 |
Ctrl + W |
删除光标前一个单词 |
Ctrl + Y |
粘贴刚才删除的内容 |
Ctrl + R |
反向搜索历史命令 |
Ctrl + G |
取消搜索 |
Ctrl + L |
清屏(同 clear) |
Ctrl + C |
终止当前进程 |
Ctrl + D |
退出/发送 EOF |
Ctrl + Z |
暂停前台进程 |
Ctrl + T |
交换光标前两个字符 |
Alt + B |
光标前移一个单词 |
Alt + F |
光标后移一个单词 |
Alt + D |
删除光标后一个单词 |
!! |
执行上一条命令 |
!n |
执行历史第 n 条命令 |
!$ |
上条命令的最后一个参数 |
!* |
上条命令的所有参数 |
sudo !! |
用 sudo 执行上条命令 |
12.2 重定向与管道
command > file.txt # 标准输出重定向到文件(覆盖)
command >> file.txt # 标准输出追加到文件
command 2> error.log # 标准错误重定向
c ommand &> all.log # 标准输出和错误都重定向
c ommand > out.log 2>&1 # 同上(传统写法)
command > /dev/null 2>&1 # 丢弃所有输出
command < input.txt # 从文件读取输入
command << EOF # Here Document(多行输入)
command <<< "string" # Here String
command1 | command2 # 管道:command1 的输出作为 command2 的输入
command1 |& command2 # 管道同时传递 stdout 和 stderr
# 进程替换(将命令输出作为文件参数)
diff <(sort file1) <(sort file2)
12.3 环境变量
# 查看
env # 显示所有环境变量
printenv PATH # 显示指定变量
echo $HOME # 显示家目录
echo $PATH # 显示命令搜索路径
echo $? # 上条命令的退出码(0=成功)
# 设置
export MY_VAR="value" # 当前会话有效
export PATH="$PATH:/usr/local/bin" # 追加到 PATH
export PATH="/usr/local/bin:$PATH" # 加到 PATH 前面
# 永久设置(写入配置文件)
echo 'export PATH="$PATH:/usr/local/go/bin"' >> ~/.bashrc
source ~/.bashrc # 重新加载配置
# 删除
unset MY_VAR
12.4 实用别名(推荐加入 ~/.bashrc)
# 安全别名
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# 便捷别名
alias ll='ls -alFh'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias diff='diff --color=auto'
alias mkdirp='mkdir -p'
# 工具别名
alias tf='tail -f'
alias ports='ss -tlnp'
alias meminfo='free -h'
alias cpuinfo='lscpu'
alias du1='du -h --max-depth=1'
alias du1s='du -h --max-depth=1 | sort -rh'
alias myip='curl -s https://ipinfo.io/ip'
# Git 别名(如果常用)
alias gs='git status'
alias gp='git pull'
alias gl='git log --oneline -10'
12.5 一键实用命令
# 查找并杀死占用端口的进程
kill -9 $(ss -tlnp | grep ':8080' | awk '{print $7}' | cut -d',' -f2 | cut -d'=' -f2)
# 批量重命名(去除文件名中的空格)
for f in *\ *; do mv "$f" "${f// /_}"; done
# 生成随机密码
openssl rand -base64 32
< /dev/urandom tr -dc 'A-Za-z0-9' | head -c 32; echo
# 查看命令执行时间
time command
# 限制进程资源使用
timeout 60s ./long-running-script.sh # 60秒后终止
ulimit -v 1048576 # 限制虚拟内存 1GB
nice -n 10 command # 低优先级运行
# 批量修改文件编码
find . -name "*.java" -exec iconv -f GBK -t UTF-8 {} -o {} \;
# 查看目录下文件数量
find . -type f | wc -l
ls -lR | grep "^-" | wc -l
# 查看当前目录大小排序
du -h --max-depth=1 2>/dev/null | sort -rh | head -20
# 快速 HTTP 静态文件服务器
python3 -m http.server 8000 # Python
npx serve -l 8000 # Node.js
php -S 0.0.0.0:8000 # PHP
附录:vi/vim 常用命令
模式切换
| 命令 |
说明 |
Esc |
回到普通模式 |
i |
在光标前插入 |
a |
在光标后插入 |
o |
在当前行下方新建行插入 |
I |
在行首插入 |
A |
在行尾插入 |
O |
在当前行上方新建行插入 |
v |
进入可视模式(字符选择) |
V |
进入可视模式(行选择) |
: |
进入命令模式 |
移动光标
| 命令 |
说明 |
h/j/k/l |
左/下/上/右 |
w/b |
下一个/上一个单词开头 |
0/$ |
行首/行尾 |
gg/G |
文件开头/文件末尾 |
Ctrl+f/b |
下/上翻一页 |
:n |
跳到第 n 行 |
编辑操作
| 命令 |
说明 |
x |
删除光标处字符 |
dd |
删除当前行 |
yy |
复制当前行 |
p |
粘贴 |
u |
撤销 |
Ctrl+r |
重做 |
r |
替换单个字符 |
保存退出
| 命令 |
说明 |
:w |
保存 |
:q |
退出 |
:wq 或 ZZ |
保存并退出 |
:q! |
不保存强制退出 |
:w !sudo tee % |
强制保存只读文件(需要 sudo) |
搜索替换
| 命令 |
说明 |
/pattern |
向下搜索 |
?pattern |
向上搜索 |
n/N |
下一个/上一个匹配 |
:%s/old/new/g |
全文替换 |
:%s/old/new/gc |
全文替换(每次确认) |
说明 :本手册中的命令已在 CentOS 7/8、Ubuntu 20.04/22.04、Debian 11/12 上验证。部分工具(如 htop、glances、tree、ncdu)可能需要通过包管理器额外安装。