Linux 进阶命令详细用法大全
一、进程控制与任务调度
1. pstree — 树形显示进程关系
基础语法
pstree [选项]
实例
# 显示所有进程树
pstree
# 显示进程树并附带PID
pstree -p
# 显示指定用户的进程树
pstree -u root
# 显示指定PID的进程树(只显示该进程及其子进程)
pstree -p 1234
# 紧凑显示(合并相同子进程)
pstree -c
常用参数
| 参数 | 说明 |
|---|---|
-p |
显示进程ID |
-u |
显示进程所属用户 |
-a |
显示完整命令行参数 |
-h |
高亮显示当前进程及其祖先 |
-n |
按PID排序输出 |
2. pgrep — 按名称查找进程PID
基础语法
pgrep [选项] 进程名
实例
# 查找nginx进程的PID
pgrep nginx
# 查找完整命令行匹配"python server.py"的进程
pgrep -f "python.*server"
# 查找属于用户root的bash进程
pgrep -u root bash
# 查找PID范围在1000-2000内的进程
pgrep -g 1000-2000
# 显示进程名和PID
pgrep -l nginx
# 查找并统计匹配进程数量
pgrep -c nginx
常用参数
| 参数 | 说明 |
|---|---|
-f |
匹配完整命令行(而非仅进程名) |
-u |
指定用户名或UID |
-l |
显示进程名和PID |
-c |
只显示匹配数量 |
-n |
只显示最新(最近启动)的进程 |
-o |
只显示最旧(最早启动)的进程 |
3. pkill — 按名称终止进程
基础语法
pkill [选项] 进程名
实例
# 终止所有nginx进程
pkill nginx
# 终止匹配完整命令行的进程(如所有Python脚本)
pkill -f "python.*server"
# 强制终止(发送SIGKILL信号)
pkill -9 nginx
# 终止属于指定用户的进程
pkill -u tomcat java
# 终止在指定终端运行的进程
pkill -t pts/0 bash
# 终止前先打印匹配的进程(安全预览)
pkill -l -f "test.sh"
常用参数
| 参数 | 说明 |
|---|---|
-f |
匹配完整命令行 |
-u |
指定用户名 |
-t |
指定终端 |
-l |
打印匹配的进程名 |
-9 |
强制终止(SIGKILL) |
-15 |
正常终止(SIGTERM,默认) |
避坑指南
- pkill会匹配所有包含关键字的进程,建议先用
pgrep -l预览再杀 - 生产环境慎用
pkill -f,可能误杀同名脚本
4. nohup — 忽略挂断信号运行
基础语法
nohup 命令 [参数] &
实例
# 后台运行脚本,退出终端后继续执行
nohup ./long_task.sh &
# 指定输出文件
nohup ./backup.sh > backup.log 2>&1 &
# 运行Python服务
nohup python3 app.py > app.log 2>&1 &
# 运行java程序
nohup java -jar myapp.jar > /dev/null 2>&1 &
常用参数
- nohup本身无参数,输出默认追加到
nohup.out &:放到后台执行2>&1:将错误输出重定向到标准输出>/dev/null:丢弃输出
避坑指南
- 即使使用nohup,脚本中的子进程仍可能因终端关闭而退出
- 配合
disown可彻底脱离shell控制
5. disown — 从shell作业表中移除
基础语法
disown [选项] [任务号]
实例
# 将后台任务从作业表中移除
./long_task.sh &
disown
# 移除指定的作业
./task1.sh &
./task2.sh &
disown %1 # 移除任务1
# 移除所有后台任务
disown -a
# 移除正在运行的任务(默认只能移除已完成的任务)
disown -r
常用参数
| 参数 | 说明 |
|---|---|
%n |
指定任务号(jobs命令查看) |
-a |
移除所有任务 |
-r |
移除正在运行的任务 |
典型用法
# 完整流程:启动→挂起→脱离shell
nohup ./task.sh > task.log 2>&1 &
disown %1
# 现在可以安全退出终端
6. screen — 终端多路复用器
基础语法
screen [选项] [命令]
实例
# 创建新会话
screen -S mysession
# 列出所有会话
screen -ls
# 恢复会话
screen -r mysession
screen -r 12345 # 使用PID恢复
# 强制恢复(用于连接断开的会话)
screen -d -r mysession
# 在会话中执行命令后退出
screen -dmS mysession ./script.sh
# 退出会话(在screen内)
Ctrl + A, 然后按 D # 分离(detach)
exit # 终止当前窗口
常用快捷键(在screen内)
| 快捷键 | 说明 |
|---|---|
Ctrl+A D |
分离会话(detach) |
Ctrl+A C |
创建新窗口 |
Ctrl+A N |
切换到下一个窗口 |
Ctrl+A P |
切换到上一个窗口 |
Ctrl+A " |
列出所有窗口 |
Ctrl+A K |
关闭当前窗口 |
Ctrl+A ? |
显示帮助 |
7. tmux — 更强大的终端复用器
基础语法
tmux [命令] [选项]
实例
# 创建新会话
tmux new -s mysession
# 列出会话
tmux ls
# 恢复会话
tmux attach -t mysession
# 创建会话并执行命令
tmux new -s mysession -d "python app.py"
# 分割窗格(水平/垂直)
tmux split-window -h # 垂直分割
tmux split-window -v # 水平分割
# 杀死会话
tmux kill-session -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 Z |
当前窗格全屏/恢复 |
8. timeout — 限制命令运行时长
基础语法
timeout [选项] 时长 命令 [参数]
实例
# 运行5秒后终止
timeout 5s ping google.com
# 运行10分钟后终止
timeout 10m ./long_task.sh
# 运行1小时后终止
timeout 1h ./backup.sh
# 超时时发送指定信号(默认SIGTERM)
timeout -s SIGKILL 10s ./stuck.sh
# 超时后保存退出状态(124=超时,0=正常完成)
timeout --preserve-status 10s ./task.sh
echo "退出码: $?"
常用参数
| 参数 | 说明 |
|---|---|
-s |
指定超时发送的信号 |
-k |
超时后先发SIGTERM,等待N秒后再强制杀 |
--preserve-status |
返回命令的实际退出码(而非124) |
时长格式
5s:秒1m:分钟1h:小时1d:天
9. nice / renice — 调整进程优先级
nice — 启动时设置优先级
# 以低优先级启动(值越大优先级越低,范围-20到19)
nice -n 10 ./large_task.sh
# 以高优先级启动(需要root)
nice -n -10 ./important_task.sh
renice — 修改运行中进程的优先级
# 调整指定PID的优先级
renice -n 5 -p 1234
# 调整所有属于某用户的进程
renice -n 10 -u tomcat
# 调整某进程组的所有进程
renice -n 5 -g 1000
优先级说明
- 范围:-20(最高)到19(最低)
- 普通用户只能调高(增大)nice值
- root用户可以调低(减小)nice值
10. taskset — 绑定进程到CPU核心
基础语法
taskset [选项] 掩码/CPU列表 命令
实例
# 查看进程当前绑定的CPU
taskset -p 1234
# 将进程绑定到CPU 0和1(掩码0x3表示bit0和bit1)
taskset -cp 0,1 1234
# 绑定到CPU 0-3
taskset -cp 0-3 1234
# 启动时绑定到CPU 2
taskset -c 2 ./heavy_task.sh
# 启动时绑定到多个CPU
taskset -c 1,3,5 ./app
常用参数
| 参数 | 说明 |
|---|---|
-c |
使用CPU列表(如0,2,4-7) |
-p |
操作已有进程(后跟PID) |
-a |
影响进程及其所有子线程 |
掩码计算
# CPU 0: 0x1 (二进制 0001)
# CPU 1: 0x2 (0010)
# CPU 2: 0x4 (0100)
# CPU 0和2: 0x5 (0101)
taskset -p 0x5 1234
11. crontab — 周期性定时任务
基础语法
crontab [选项] [文件]
实例
# 编辑当前用户的crontab
crontab -e
# 查看当前用户的定时任务
crontab -l
# 删除所有定时任务
crontab -r
# 从文件导入任务
crontab my_cron.txt
# 以指定用户身份操作(需root)
crontab -u username -e
crontab时间格式
* * * * * 命令
┬ ┬ ┬ ┬ ┬
│ │ │ │ └─ 星期几 (0-7, 0和7都表示周日)
│ │ │ └─── 月份 (1-12)
│ │ └───── 日 (1-31)
│ └─────── 小时 (0-23)
└───────── 分钟 (0-59)
常用示例
# 每天凌晨2点备份
0 2 * * * /usr/local/bin/backup.sh
# 每周一早上6点清理
0 6 * * 1 /usr/local/bin/cleanup.sh
# 每5分钟检查服务
*/5 * * * * /usr/local/bin/health_check.sh
# 每月1号凌晨3点生成报表
0 3 1 * * /usr/local/bin/gen_report.sh
# 工作日每小时执行
0 * * * 1-5 /usr/local/bin/hourly_task.sh
# 每30分钟执行
*/30 * * * * /usr/local/bin/half_hour_task.sh
避坑指南
- crontab环境变量极少,脚本中必须使用绝对路径
- 可在crontab顶部设置
PATH=/usr/local/bin:/usr/bin:/bin - 输出重定向到日志:
0 2 * * * /script.sh >> /var/log/cron.log 2>&1
12. at — 一次性定时任务
基础语法
at [选项] 时间
实例
# 2小时后执行
at now + 2 hours
at> /usr/local/bin/backup.sh
at> <Ctrl+D> # 按Ctrl+D保存退出
# 明天下午3点执行
at 3pm tomorrow
at> echo "任务执行" | mail -s "通知" [email protected]
at> <Ctrl+D>
# 从文件读取任务
echo "/usr/bin/cleanup.sh" | at now + 1 day
# 查看待执行任务
atq
# 删除指定任务
atrm 5 # 删除任务编号5
# 指定用户(需root)
at -u username 10:00
常用参数
| 参数 | 说明 |
|---|---|
-l |
列出待执行任务(同atq) |
-r |
删除任务(同atrm) |
-f |
从文件读取命令 |
-q |
指定队列(a/b/c…) |
-m |
任务完成后发送邮件 |
二、网络诊断与通信
13. ss — 套接字统计(替代netstat)
基础语法
ss [选项] [过滤]
实例
# 查看所有TCP连接
ss -t
# 查看所有UDP连接
ss -u
# 查看所有监听端口
ss -l
# 显示进程信息(需要root)
ss -p
# 查看所有TCP监听端口及进程
ss -tlnp
# 查看所有已建立的连接
ss -t state established
# 查看端口8080的连接
ss -tuln sport = :8080 # 源端口
ss -tuln dport = :443 # 目标端口
# 查看IPv4所有连接
ss -4
# 查看IPv6所有连接
ss -6
# 显示统计摘要
ss -s
常用参数
| 参数 | 说明 |
|---|---|
-t |
TCP套接字 |
-u |
UDP套接字 |
-l |
监听状态的套接字 |
-n |
不解析服务名(显示数字端口) |
-p |
显示进程PID和名称 |
-a |
显示所有套接字(含监听和非监听) |
-s |
统计摘要 |
-4/-6 |
IPv4/IPv6 |
14. traceroute — 路由追踪
基础语法
traceroute [选项] 目标地址
实例
# 追踪到百度的路由
traceroute baidu.com
# 跳过DNS解析(加快速度)
traceroute -n baidu.com
# 设置最大跳数(默认30)
traceroute -m 10 baidu.com
# 使用ICMP包(而非UDP)
traceroute -I baidu.com
# 指定端口
traceroute -p 80 baidu.com
# IPv6追踪
traceroute -6 2001:4860:4860::8888
常用参数
| 参数 | 说明 |
|---|---|
-n |
不解析IP为域名 |
-m |
最大跳数(TTL) |
-p |
指定起始端口 |
-I |
使用ICMP Echo |
-T |
使用TCP SYN |
-w |
等待响应时间(秒) |
15. mtr — 动态路由追踪(ping+路由)
基础语法
mtr [选项] 目标地址
实例
# 追踪到谷歌
mtr google.com
# 只显示前10跳
mtr -m 10 google.com
# 报告模式(发送10个包后生成报告)
mtr -r -c 10 google.com
# 报告模式输出到文件
mtr -r -c 100 google.com > report.txt
# 使用TCP(需要端口)
mtr -T -P 443 google.com
# 禁用DNS解析
mtr -n google.com
# 间隔0.5秒发送(默认1秒)
mtr -i 0.5 google.com
输出字段说明
| 字段 | 说明 |
|---|---|
| Loss% | 丢包率 |
| Snt | 已发送包数 |
| Last | 最近一次延迟 |
| Avg | 平均延迟 |
| Best | 最低延迟 |
| Wrst | 最高延迟 |
| StDev | 延迟标准差 |
16. tcpdump — 命令行抓包
基础语法
tcpdump [选项] [过滤表达式]
实例
# 抓取所有包
tcpdump -i eth0
# 抓取指定端口的包
tcpdump -i any port 80
# 抓取HTTP流量并保存
tcpdump -i eth0 port 80 -w http.pcap
# 读取保存的包文件
tcpdump -r http.pcap
# 只抓取10个包
tcpdump -c 10 -i eth0
# 显示IP地址而非主机名
tcpdump -n -i eth0
# 显示更详细信息(协议头)
tcpdump -v -i eth0
# 抓取SYN包(TCP三次握手)
tcpdump -i any 'tcp[13] & 2 != 0'
# 抓取源IP或目标IP
tcpdump -i eth0 host 192.168.1.1
# 抓取源IP为10.0.0.1的包
tcpdump -i eth0 src 10.0.0.1
# 抓取目标端口为443的包
tcpdump -i eth0 dst port 443
# 抓取ICMP包(ping)
tcpdump -i eth0 icmp
常用参数
| 参数 | 说明 |
|---|---|
-i |
指定网卡(any表示所有) |
-w |
写入文件(pcap格式) |
-r |
读取pcap文件 |
-c |
抓取N个包后停止 |
-n |
不解析域名和端口 |
-v/-vv |
详细输出 |
-A |
以ASCII显示包内容 |
过滤表达式
# 组合过滤(and/or)
tcpdump -i eth0 'port 80 and host 192.168.1.1'
# 排除某IP
tcpdump -i eth0 'not host 192.168.1.1'
# 抓取大于1000字节的包
tcpdump -i eth0 'greater 1000'
17. nmap — 网络扫描
基础语法
nmap [扫描类型] [选项] 目标
实例
# 扫描指定IP的开放端口(默认1-1000)
nmap 192.168.1.1
# 扫描1-10000端口
nmap -p 1-10000 192.168.1.1
# 扫描常见端口
nmap -p 22,80,443,3306 192.168.1.1
# TCP SYN扫描(半开扫描,需root)
nmap -sS 192.168.1.1
# TCP连接扫描
nmap -sT 192.168.1.1
# UDP扫描
nmap -sU 192.168.1.1
# 操作系统检测
nmap -O 192.168.1.1
# 服务版本检测
nmap -sV 192.168.1.1
# 快速扫描(只扫常用端口)
nmap -F 192.168.1.1
# 扫描整个子网
nmap 192.168.1.0/24
# 从文件读取目标
nmap -iL targets.txt
常用参数
| 参数 | 说明 |
|---|---|
-p |
指定端口范围 |
-sS |
SYN扫描(半开) |
-sT |
TCP连接扫描 |
-sU |
UDP扫描 |
-O |
操作系统检测 |
-sV |
服务版本检测 |
-F |
快速扫描(100个端口) |
-A |
全面扫描(OS+版本+脚本) |
-T0~5 |
扫描速度(0最慢5最快) |
18. nc — 网络瑞士军刀
基础语法
nc [选项] [主机] [端口]
实例
# 端口扫描
nc -zv 192.168.1.1 22
nc -zv 192.168.1.1 1-1000
# 监听端口(服务端)
nc -l 9999
# 连接远程端口(客户端)
nc 192.168.1.100 9999
# 传输文件(服务端接收)
nc -l 9999 > received.txt
# 传输文件(客户端发送)
nc 192.168.1.100 9999 < file.txt
# 传输目录(压缩后发送)
tar -czf - /data | nc -l 9999
nc 192.168.1.100 9999 | tar -xzf -
# 聊天(一行行发送)
nc -l 9999
# 另一边:nc 192.168.1.100 9999
# 反向Shell(客户端获得服务端Shell)
# 服务端(目标机器)
nc -l 9999 -e /bin/bash
# 客户端
nc 192.168.1.100 9999
# 超时设置
nc -w 2 192.168.1.1 22
常用参数
| 参数 | 说明 |
|---|---|
-l |
监听模式(服务端) |
-p |
指定本地端口 |
-v |
详细输出 |
-z |
零I/O模式(仅扫描) |
-n |
不解析域名 |
-w |
超时时间(秒) |
-e |
执行程序(危险,需谨慎) |
-u |
UDP模式 |
19. dig — DNS查询工具
基础语法
dig [选项] 域名 [记录类型] [@DNS服务器]
实例
# 查询A记录(默认)
dig baidu.com
# 查询指定DNS服务器
dig @8.8.8.8 baidu.com
# 只返回IP地址(精简输出)
dig baidu.com +short
# 查询MX记录(邮件交换)
dig baidu.com MX
# 查询NS记录(域名服务器)
dig baidu.com NS
# 查询TXT记录
dig baidu.com TXT
# 查询CNAME记录
dig www.baidu.com CNAME
# 查询所有记录
dig baidu.com ANY
# 反向查询(IP到域名)
dig -x 8.8.8.8
# 追踪DNS解析路径
dig baidu.com +trace
# 使用TCP方式查询
dig baidu.com +tcp
记录类型
| 类型 | 说明 |
|---|---|
| A | IPv4地址 |
| AAAA | IPv6地址 |
| MX | 邮件交换服务器 |
| NS | 域名服务器 |
| CNAME | 别名记录 |
| TXT | 文本记录 |
| SOA | 授权记录 |
| PTR | 反向解析 |
20. ip — 网络配置(替代ifconfig)
基础语法
ip [选项] 对象 命令
查看网络信息
# 查看所有网络接口
ip addr
ip a # 简写
# 查看指定接口
ip addr show eth0
# 查看路由表
ip route
ip r # 简写
# 查看ARP表
ip neigh
ip n # 简写
# 查看链路状态
ip link show
# 查看统计信息
ip -s link show eth0
配置网络
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 添加IP地址
ip addr add 192.168.1.100/24 dev eth0
# 删除IP地址
ip addr del 192.168.1.100/24 dev eth0
# 添加默认网关
ip route add default via 192.168.1.1
# 添加静态路由
ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0
# 删除路由
ip route del 10.0.0.0/8
# 清空ARP表
ip neigh flush all
21. ethtool — 网卡参数查看
基础语法
ethtool [选项] 接口名
实例
# 查看网卡基本信息
ethtool eth0
# 查看网卡驱动信息
ethtool -i eth0
# 查看网卡统计
ethtool -S eth0
# 设置网卡速率和双工模式
ethtool -s eth0 speed 1000 duplex full
# 查看光模块信息(SFP)
ethtool -m eth0
# 查看网卡支持的功能
ethtool -k eth0
# 开启/关闭硬件校验和
ethtool -K eth0 rx on tx on
# 查看网卡缓冲区
ethtool -g eth0
# 设置环缓冲区大小
ethtool -G eth0 rx 4096 tx 4096
22. iperf3 — 网络带宽测试
基础语法
iperf3 [选项]
服务端
# 启动服务端(默认端口5201)
iperf3 -s
# 指定端口
iperf3 -s -p 5202
# 后台运行
iperf3 -s -D
# 记录日志
iperf3 -s -J > result.json
客户端
# 测试上行带宽(默认)
iperf3 -c 192.168.1.1
# 测试下行带宽
iperf3 -c 192.168.1.1 -R
# 指定测试时长(秒)
iperf3 -c 192.168.1.1 -t 30
# 测试UDP带宽
iperf3 -c 192.168.1.1 -u -b 100M
# 指定端口
iperf3 -c 192.168.1.1 -p 5202
# 并行流(增加吞吐)
iperf3 -c 192.168.1.1 -P 4
# 反向传输
iperf3 -c 192.168.1.1 -R
23. iftop — 实时流量监控
基础语法
iftop [选项]
实例
# 监控默认网卡
iftop
# 监控指定网卡
iftop -i eth0
# 不解析主机名(加快速度)
iftop -n
# 显示端口信息
iftop -P
# 过滤指定IP
iftop -f "host 192.168.1.1"
# 以MB为单位显示
iftop -B
# 设置刷新间隔
iftop -t 2 # 每2秒刷新
交互快捷键(运行中)
| 按键 | 说明 |
|---|---|
h |
显示帮助 |
n |
切换DNS解析 |
s |
切换源IP显示 |
d |
切换目标IP显示 |
p |
显示端口号 |
q |
退出 |
24. nethogs — 按进程显示流量
基础语法
nethogs [选项] [网卡]
实例
# 监控所有网卡
nethogs
# 监控指定网卡
nethogs eth0
# 每秒刷新
nethogs -d 2
# 只监控eth0,5秒刷新
nethogs eth0 -d 5
# 查看进程流量排序
nethogs -c 10 # 只显示前10
三、磁盘与存储管理
25. df — 磁盘空间查看
基础语法
df [选项] [挂载点]
实例
# 查看所有挂载点
df
# 人类可读格式
df -h
# 以MB显示
df -m
# 显示文件系统类型
df -T
# 查看inode使用情况
df -i
# 只查看特定挂载点
df -h /
# 排除伪文件系统
df -h -x tmpfs -x devtmpfs
# 显示总计
df -h --total
26. du — 目录大小统计
基础语法
du [选项] [路径]
实例
# 当前目录大小
du
# 人类可读
du -h
# 只显示总计
du -sh /var
# 显示各子目录大小
du -h --max-depth=1 /var
# 排序找出最大目录
du -sh * | sort -rh
# 排除特定目录
du -h --exclude=cache /var
# 显示文件和目录大小
du -ah /var/log
# 统计总大小
du -sh /home/user
27. fdisk — 磁盘分区
基础语法
fdisk [选项] 磁盘设备
实例
# 查看所有磁盘分区
fdisk -l
# 查看指定磁盘
fdisk -l /dev/sda
# 进入交互式分区界面
fdisk /dev/sdb
# 显示分区类型
fdisk -l -t dos /dev/sda
交互命令(fdisk /dev/sdb 内)
| 命令 | 说明 |
|---|---|
m |
显示帮助 |
p |
显示分区表 |
n |
创建新分区 |
d |
删除分区 |
t |
修改分区类型 |
w |
写入并退出 |
q |
不保存退出 |
28. parted — GPT分区工具
基础语法
parted [选项] [设备] [命令]
实例
# 查看所有分区
parted -l
# 交互模式
parted /dev/sdb
# 创建GPT分区表
parted /dev/sdb mklabel gpt
# 创建分区(起始0%,结束100%)
parted /dev/sdb mkpart primary 0% 100%
# 创建分区(指定大小)
parted /dev/sdb mkpart primary ext4 1MiB 10GiB
# 删除分区
parted /dev/sdb rm 1
# 调整分区大小
parted /dev/sdb resizepart 1 20GiB
# 非交互模式
parted -s /dev/sdb mkpart primary ext4 0% 100%
29. mkfs — 格式化文件系统
基础语法
mkfs.[文件系统类型] [选项] 设备
实例
# 格式化为ext4
mkfs.ext4 /dev/sdb1
# 格式化为xfs
mkfs.xfs /dev/sdb1
# 格式化为ext3
mkfs.ext3 /dev/sdb1
# 格式化为FAT32
mkfs.vfat /dev/sdb1
# 格式化为NTFS(需ntfs-3g)
mkfs.ntfs /dev/sdb1
# 格式化时指定卷标
mkfs.ext4 -L data_disk /dev/sdb1
# 快速格式化(不检查坏块)
mkfs.ext4 -F /dev/sdb1
30. mount/umount — 挂载/卸载
基础语法
mount [选项] 设备 挂载点
umount [选项] 挂载点|设备
实例
# 挂载设备
mount /dev/sdb1 /mnt/data
# 只读挂载
mount -o ro /dev/sdb1 /mnt/data
# 挂载ISO文件
mount -o loop /path/to/image.iso /mnt/iso
# 挂载NFS
mount -t nfs 192.168.1.100:/export /mnt/nfs
# 挂载并指定文件系统类型
mount -t ext4 /dev/sdb1 /mnt/data
# 重新挂载(从只读改为读写)
mount -o remount,rw /mnt/data
# 显示所有已挂载系统
mount
# 卸载
umount /mnt/data
umount /dev/sdb1
# 强制卸载(当设备忙)
umount -f /mnt/data
# 懒惰卸载(等设备空闲后自动卸载)
umount -l /mnt/data
31. blkid — 查看块设备UUID
基础语法
blkid [选项] [设备]
实例
# 查看所有块设备
blkid
# 查看指定设备
blkid /dev/sda1
# 只显示UUID
blkid -s UUID /dev/sda1
# 只显示文件系统类型
blkid -s TYPE /dev/sda1
# 只显示LABEL
blkid -s LABEL /dev/sda1
# 输出键值对
blkid -o export /dev/sda1
32. lsblk — 树形显示块设备
基础语法
lsblk [选项]
实例
# 显示所有块设备树
lsblk
# 显示文件系统信息
lsblk -f
# 显示UUID和挂载点
lsblk -o NAME,UUID,MOUNTPOINT
# 显示磁盘大小
lsblk -b # 字节
lsblk -m # 人类可读
# 显示拓扑信息
lsblk -t
# 只显示磁盘(不显示分区)
lsblk -d
# JSON格式输出
lsblk -J
33. fsck — 文件系统检查修复
基础语法
fsck [选项] 设备
实例
# 检查文件系统(必须先卸载)
umount /dev/sdb1
fsck /dev/sdb1
# 自动修复
fsck -a /dev/sdb1
fsck -y /dev/sdb1 # 所有问题回答yes
# 强制检查(即使文件系统看起来干净)
fsck -f /dev/sdb1
# 只检查不修复
fsck -n /dev/sdb1
# 检查ext4文件系统
fsck.ext4 /dev/sdb1
# 检查xfs文件系统
xfs_repair /dev/sdb1
避坑指南
- 检查的设备必须处于未挂载状态
- 根分区检查需进入救援模式
34. dd — 低级数据复制
基础语法
dd if=输入文件 of=输出文件 [选项]
实例
# 创建1G空文件
dd if=/dev/zero of=test.img bs=1M count=1024
# 备份硬盘到镜像
dd if=/dev/sda of=/backup/sda.img bs=4M
# 从镜像恢复
dd if=/backup/sda.img of=/dev/sda bs=4M
# 克隆分区
dd if=/dev/sda1 of=/dev/sdb1 bs=4M
# 创建启动盘
dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress
# 生成随机数据文件
dd if=/dev/urandom of=random.dat bs=1M count=100
# 测磁盘写入速度
dd if=/dev/zero of=test bs=1M count=1024 conv=fdatasync
# 销毁磁盘数据
dd if=/dev/urandom of=/dev/sdb bs=4M
常用参数
| 参数 | 说明 |
|---|---|
bs= |
块大小 |
count= |
块数量 |
seek= |
输出跳过块数 |
skip= |
输入跳过块数 |
conv=fdatasync |
确保数据写入物理磁盘 |
status=progress |
显示进度(新版dd) |
35. fallocate — 快速创建文件
基础语法
fallocate [选项] 文件名
实例
# 创建10G文件(瞬间完成)
fallocate -l 10G largefile.bin
# 创建文件并填充指定字符
fallocate -l 1G -z test.bin
# 压缩文件(释放空洞)
fallocate -d file.bin
# 预分配空间(保留不写入)
fallocate -l 5G -n sparse_file.bin
# 扩展文件长度
fallocate -l +100M logfile.log
与dd对比
# dd方式(慢)
dd if=/dev/zero of=test.img bs=1M count=1024
# fallocate方式(快100倍以上)
fallocate -l 1G test.img
36. rsync — 高效文件同步
基础语法
rsync [选项] 源 目标
实例
# 本地复制(类似cp)
rsync -av /source/ /dest/
# 远程复制(推)
rsync -av /local/data/ user@host:/remote/data/
# 远程复制(拉)
rsync -av user@host:/remote/data/ /local/data/
# 增量备份(只传输变化)
rsync -av --delete /source/ /backup/
# 排除特定文件
rsync -av --exclude='*.log' /source/ /dest/
# 排除多个目录
rsync -av --exclude='cache' --exclude='tmp' /source/ /dest/
# 显示传输进度
rsync -av --progress /large_file user@host:/dest/
# 压缩传输(节省带宽)
rsync -avz /source/ user@host:/dest/
# 保持文件属性(权限、时间、所有者)
rsync -avogp /source/ /dest/
# 限速传输(KB/s)
rsync -av --bwlimit=1000 /source/ user@host:/dest/
# 基于SSH使用不同端口
rsync -av -e "ssh -p 2222" /source/ user@host:/dest/
常用参数
| 参数 | 说明 |
|---|---|
-a |
归档模式(保留权限、时间等) |
-v |
详细输出 |
-z |
传输时压缩 |
-P |
显示进度(同–progress) |
--delete |
删除目标端多余文件(保持完全同步) |
--exclude |
排除文件/目录 |
--bwlimit |
限速(KB/s) |
37. lsof — 列出打开的文件
基础语法
lsof [选项] [文件名]
实例
# 列出所有打开的文件
lsof
# 查看指定用户打开的文件
lsof -u username
# 查看指定进程打开的文件
lsof -p 1234
# 查看某个文件被哪些进程使用
lsof /var/log/syslog
# 查看目录下打开的文件
lsof +D /var/log/
# 查看端口8080被谁占用
lsof -i :8080
# 查看TCP连接
lsof -i tcp
# 查看UDP连接
lsof -i udp
# 查看所有网络连接
lsof -i
# 查找已删除但未释放空间的文件
lsof +L1
# 列出NFS打开的文件
lsof -N
# 组合条件(排除root用户)
lsof -u ^root
常用参数
| 参数 | 说明 |
|---|---|
-p |
指定进程PID |
-u |
指定用户 |
-i |
网络连接 |
+D |
递归目录 |
+L1 |
显示已删未释放 |
-c |
指定命令名 |
38. fuser — 查看文件被谁使用
基础语法
fuser [选项] 文件/目录
实例
# 查看文件被哪些进程使用
fuser /var/log/syslog
# 查看目录被哪些进程使用
fuser -v /mnt/data
# 显示进程名和用户
fuser -v /var/log/
# 使用TCP端口查找进程
fuser -v -n tcp 80
fuser -v 80/tcp
# 使用UDP端口
fuser -v -n udp 53
# 杀死使用文件的进程
fuser -k /var/log/syslog
# 交互式询问后杀死
fuser -k -i /var/log/syslog
# 显示完整信号
fuser -v -n tcp 8080
常用参数
| 参数 | 说明 |
|---|---|
-v |
详细输出 |
-k |
杀死使用文件的进程 |
-i |
交互模式(确认后杀) |
-n |
指定命名空间(tcp/udp/file) |
四、系统监控与性能分析
39. htop — 增强版top
基础语法
htop [选项]
实例
# 启动htop
htop
# 只显示指定用户的进程
htop -u username
# 以树形显示
htop -t
# 排序方式
htop -s PERCENT_CPU # 按CPU排序
交互快捷键
| 按键 | 说明 |
|---|---|
F1 / h |
帮助 |
F2 / s |
设置 |
F3 / / |
搜索 |
F4 / \ |
过滤 |
F5 / t |
树形视图 |
F6 / > |
排序 |
F7 / ] |
增加nice值(降低优先级) |
F8 / [ |
减少nice值 |
F9 / k |
杀死进程 |
F10 / q |
退出 |
空格 |
标记进程 |
40. vmstat — 虚拟内存统计
基础语法
vmstat [选项] [刷新间隔] [次数]
实例
# 显示一次统计
vmstat
# 每秒刷新,共5次
vmstat 1 5
# 显示磁盘统计
vmstat -d
# 显示磁盘分区统计
vmstat -D
# 显示内存统计(以MB为单位)
vmstat -S M
# 显示活动和非活动内存
vmstat -a
# 显示slab信息
vmstat -s
输出字段解读
| 字段 | 说明 |
|---|---|
r |
运行队列(>CPU核心数表示过载) |
b |
阻塞进程数 |
si/so |
swap换入/换出(>0表示内存不足) |
us/sy/id/wa |
用户/系统/空闲/IO等待CPU百分比 |
in |
中断数 |
cs |
上下文切换数 |
41. iostat — IO统计
基础语法
iostat [选项] [刷新间隔] [次数]
实例
# 显示一次统计
iostat
# 每秒刷新
iostat 1
# 显示详细IO信息
iostat -x 1
# 只显示磁盘信息(不显示CPU)
iostat -d 1
# 以MB为单位显示
iostat -m
# 显示设备名而非分区
iostat -N
# 显示LVM信息
iostat -g
# 持续监控,显示5次
iostat -x 2 5
关键指标解读
| 指标 | 说明 | 告警阈值 |
|---|---|---|
%util |
磁盘利用率 | >90%表示满负载 |
await |
平均IO延迟 | >10ms表示慢 |
svctm |
服务时间 | 越高表示设备性能差 |
r/s/w/s |
每秒读写次数 | 随业务变化 |
rkB/s/wkB/s |
每秒读写KB | - |
42. mpstat — 多核CPU监控
基础语法
mpstat [选项] [刷新间隔] [次数]
实例
# 显示所有核心统计
mpstat -P ALL 1
# 只显示CPU0
mpstat -P 0 1
# 显示一次统计
mpstat
# 显示每个核心的CPU使用率
mpstat -P ALL 2 5
43. sar — 系统活动报告
基础语法
sar [选项] [刷新间隔] [次数]
实例
# 查看CPU使用率
sar -u 1 3
# 查看内存使用
sar -r 1 3
# 查看swap使用
sar -S 1 3
# 查看磁盘IO
sar -b 1 3
# 查看网络流量
sar -n DEV 1 3
# 查看所有网卡流量
sar -n EDEV 1 3
# 查看历史数据(/var/log/sa/)
sar -u -f /var/log/sa/sa22
# 查看今天的CPU历史
sar -u
# 查看进程队列
sar -q 1 3
44. dstat — 全能性能工具
基础语法
dstat [选项] [刷新间隔] [次数]
实例
# 默认统计(CPU/磁盘/网络/内存)
dstat
# 显示CPU、磁盘、网络、内存
dstat -c -d -n -m
# 显示最占用CPU的进程
dstat --top-cpu
# 显示最占用IO的进程
dstat --top-io
# 显示最占用内存的进程
dstat --top-mem
# 显示完整统计
dstat -cdngy 1
# 以CSV格式输出
dstat -cdngy --output report.csv
45. perf — 性能调优终极工具
基础语法
perf [命令] [选项]
实例
# 实时显示CPU热点函数
perf top
# 对进程采样10秒
perf record -p 1234 -g -- sleep 10
# 查看采样报告
perf report
# 统计性能事件
perf stat -e cpu-clock,task-clock ./program
# 统计CPU周期
perf stat -e cycles,instructions ./program
# 生成火焰图数据
perf record -F 99 -ag -- sleep 30
perf script > out.perf
# 统计系统调用
perf trace -p 1234
# 监控所有CPU的缓存命中
perf stat -e cache-misses,cache-references ./program
46. strace — 追踪系统调用
基础语法
strace [选项] 命令/PID
实例
# 追踪命令的系统调用
strace ls
# 附加到运行中的进程
strace -p 1234
# 只追踪特定系统调用
strace -e trace=open,read,write ls
# 追踪网络相关调用
strace -e trace=network curl google.com
# 显示时间戳
strace -tt ls
# 显示调用耗时
strace -T ls
# 统计系统调用次数
strace -c ls
# 输出到文件
strace -o output.log ls
# 追踪子进程(慎用,会很慢)
strace -f -p 1234
47. ltrace — 追踪库函数调用
基础语法
ltrace [选项] 命令/PID
实例
# 追踪库函数
ltrace ls
# 附加到进程
ltrace -p 1234
# 只追踪特定库函数
ltrace -e malloc+free ls
# 显示时间戳
ltrace -tt ls
# 输出到文件
ltrace -o output.log ls
48. gdb — GNU调试器
基础语法
gdb [选项] [程序] [核心文件]
实例
# 调试程序
gdb ./myapp
# 附加到运行进程
gdb -p 1234
# 调试core文件
gdb ./myapp core.1234
# 运行参数
gdb --args ./myapp -c config.ini
# 常用gdb命令(在gdb内)
(gdb) run # 运行
(gdb) break main # 设置断点
(gdb) next # 下一步
(gdb) step # 步入
(gdb) print var # 打印变量
(gdb) bt # 查看堆栈
(gdb) info threads # 查看线程
(gdb) thread 2 # 切换线程
(gdb) continue # 继续执行
(gdb) quit # 退出
49. dmesg — 内核消息
基础语法
dmesg [选项]
实例
# 显示所有内核消息
dmesg
# 显示带时间戳
dmesg -T
# 显示最近20条
dmesg -T | tail -20
# 显示错误级别消息
dmesg -l err
# 显示警告及以上
dmesg -l warn,err
# 实时查看
dmesg -w
# 清除内核缓冲区
dmesg -c
# 查看硬件检测
dmesg | grep -i "hardware\|device"
50. journalctl — systemd日志
基础语法
journalctl [选项] [匹配规则]
实例
# 显示所有日志
journalctl
# 实时查看
journalctl -f
# 查看指定服务
journalctl -u nginx
# 查看指定时间后
journalctl --since "1 hour ago"
journalctl --since "2024-01-01 00:00:00"
# 查看指定时间范围
journalctl --since "today" --until "now"
# 显示指定PID
journalctl _PID=1234
# 显示内核日志
journalctl -k
# 显示错误级别
journalctl -p err
# 显示最近20行
journalctl -n 20
# 输出JSON格式
journalctl -o json
# 查看磁盘占用
journalctl --disk-usage
# 清理日志(保留2天)
journalctl --vacuum-time=2d
五、文本处理(三剑客之外)
51. sed — 流编辑器
基础语法
sed [选项] '动作' 文件
实例
# 替换每行第一个hello为world
sed 's/hello/world/' file.txt
# 替换所有(全局)
sed 's/hello/world/g' file.txt
# 替换并保存(备份)
sed -i.bak 's/old/new/g' file.txt
# 删除第3行
sed '3d' file.txt
# 删除5-10行
sed '5,10d' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除包含pattern的行
sed '/pattern/d' file.txt
# 只打印第5行
sed -n '5p' file.txt
# 打印匹配行
sed -n '/error/p' file.txt
# 在匹配行前插入
sed '/pattern/i\插入内容' file.txt
# 在匹配行后追加
sed '/pattern/a\追加内容' file.txt
# 替换匹配行中的内容
sed '/pattern/s/old/new/g' file.txt
# 匹配行范围
sed '/start/,/end/ s/old/new/g' file.txt
# 多次替换
sed -e 's/a/A/g' -e 's/b/B/g' file.txt
52. awk — 文本处理编程语言
基础语法
awk '模式{动作}' 文件
实例
# 打印第1列和第3列
awk '{print $1, $3}' file.txt
# 打印整行
awk '{print $0}' file.txt
# 指定分隔符
awk -F':' '{print $1}' /etc/passwd
# 以冒号为分隔符,打印第1和第7列
awk -F':' '{print $1, $7}' /etc/passwd
# 匹配包含root的行
awk '/root/ {print $1}' /etc/passwd
# 打印行号
awk '{print NR, $0}' file.txt
# 打印最后一列
awk '{print $NF}' file.txt
# 过滤(第3列大于100)
awk '$3 > 100' file.txt
# 统计求和
awk '{sum += $2} END {print sum}' file.txt
# 计算平均值
awk '{sum += $2; count++} END {print sum/count}' file.txt
# 去重(经典用法)
awk '!seen[$0]++' file.txt
# 统计各IP访问次数
awk '{count[$1]++} END {for(ip in count) print ip, count[ip]}' access.log
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
# 条件判断
awk '{if($3>80) print $1 "超时"; else print $1 "正常"}' file.txt
# BEGIN/END块
awk 'BEGIN{print "开始"} {print $1} END{print "结束"}' file.txt
# 多分隔符
awk -F'[,: ]' '{print $1, $3}' file.txt
# 输出指定行
awk 'NR>=10 && NR<=20' file.txt
53. tr — 字符替换/删除/压缩
基础语法
tr [选项] 集合1 [集合2]
实例
# 小写转大写
echo "hello" | tr 'a-z' 'A-Z'
# 大写转小写
echo "HELLO" | tr 'A-Z' 'a-z'
# 删除数字
echo "abc123def" | tr -d '0-9'
# 删除换行符
tr -d '\n' < file.txt
# 删除所有非字母字符
echo "hello123world!@" | tr -dc 'a-zA-Z'
# 压缩空格(多个空格变一个)
echo "a b" | tr -s ' '
# 将换行替换为空格(合并为一行)
tr '\n' ' ' < file.txt
# 将逗号替换为TAB
tr ',' '\t' < csv.txt
# 只保留数字
echo "abc123def456" | tr -dc '0-9'
# 将多个连续换行压缩为单个
tr -s '\n' < file.txt
# Windows换行转Linux
tr -d '\r' < win.txt > linux.txt
54. diff — 比较文件差异
基础语法
diff [选项] 文件1 文件2
实例
# 比较两个文件
diff old.txt new.txt
# 统一格式输出(patch友好)
diff -u old.txt new.txt
# 忽略空格
diff -b file1 file2
# 忽略所有空白
diff -w file1 file2
# 忽略大小写
diff -i file1 file2
# 并排显示
diff -y file1 file2
# 只显示是否不同
diff -q file1 file2
# 递归比较目录
diff -r dir1/ dir2/
# 生成补丁
diff -u old.conf new.conf > update.patch
# 应用补丁
patch < update.patch
# 显示上下文(3行)
diff -c file1 file2
55. patch — 应用补丁
基础语法
patch [选项] < 补丁文件
实例
# 应用补丁
patch < update.patch
# 试运行(不实际修改)
patch --dry-run < update.patch
# 反向应用(回退)
patch -R < update.patch
# 备份原文件
patch -b < update.patch
# 指定目录
patch -d /path/to/dir < update.patch
# 忽略空格差异
patch -l < update.patch
56. paste — 按列合并文件
基础语法
paste [选项] 文件1 文件2
实例
# 默认TAB分隔合并
paste file1.txt file2.txt
# 逗号分隔
paste -d',' file1.txt file2.txt
# 多文件合并
paste -d':' file1 file2 file3
# 将文件所有行合并为一行
paste -s file.txt
# 用TAB合并所有行
paste -s -d'\t' file.txt
# 读取标准输入
echo "a b c" | paste -d',' - - -
# 输出: a,b,c
# 合并CSV文件
paste -d',' names.txt scores.txt > students.csv
57. join — 按字段合并(类数据库JOIN)
基础语法
join [选项] 文件1 文件2
实例
# 以第一列为连接键合并
join file1.txt file2.txt
# 指定分隔符
join -t',' file1.csv file2.csv
# 指定连接字段
join -1 1 -2 2 file1.txt file2.txt
# 输出未匹配的行
join -a1 file1.txt file2.txt
join -a2 file1.txt file2.txt
# 不显示连接字段
join -o 1.2,2.2 file1.txt file2.txt
58. comm — 比较已排序文件
基础语法
comm [选项] 文件1 文件2
实例
# 比较两个排序文件
comm file1.txt file2.txt
# 输出三列:仅在file1、仅在file2、共有
# 只显示共有行
comm -12 file1.txt file2.txt
# 只显示在file1中独有的
comm -23 file1.txt file2.txt
# 只显示在file2中独有的
comm -13 file1.txt file2.txt
# 不显示列分隔符
comm --nocheck-order file1.txt file2.txt
59. xargs — 构建命令行
基础语法
xargs [选项] [命令]
实例
# 基本用法
ls *.txt | xargs rm
# 每行一个参数
echo "file1 file2 file3" | xargs -n 1 ls -l
# 每行最多2个参数
echo "a b c d" | xargs -n 2
# 并发执行(10个并行)
cat urls.txt | xargs -n 1 -P 10 curl -O
# 使用占位符
find . -name "*.txt" | xargs -I {} cp {} /backup/
# 空文件不执行
find . -name "*.tmp" | xargs -r rm
# 交互确认
find . -name "*.log" | xargs -p rm
# 组合grep
find . -name "*.py" | xargs grep -l "error"
# 统计文件行数
find . -name "*.txt" | xargs wc -l
# 限制每次参数数量(分批处理)
echo {1..100} | xargs -n 10 echo
常用参数
| 参数 | 说明 |
|---|---|
-n |
每行最大参数个数 |
-I |
替换字符串 |
-P |
并行执行数 |
-p |
执行前询问 |
-r |
无输入时不执行 |
-0 |
以null分隔(与find -print0配合) |
60. parallel — 强大并行执行
基础语法
parallel [选项] 命令 ::: 参数列表
实例
# 并行压缩所有日志
parallel 'gzip {}' ::: *.log
# 并行wget下载
parallel -j 10 wget -q {} ::: urls.txt
# 从文件读取参数
parallel -a urls.txt wget -q {}
# 多个参数组合
parallel echo {1} {2} ::: {1..3} ::: {a..c}
# 替换字符串
parallel --xapply echo {1} {2} ::: a b c ::: 1 2 3
# 进度显示
parallel --progress gzip {} ::: *.log
# 按行读取
cat urls.txt | parallel --pipe -N 100 wget -q {}
# 远程执行
parallel -S user@host --transferfile {} gzip ::: *.log
61. split — 分割文件
基础语法
split [选项] 文件 [前缀]
实例
# 按行分割(每1000行)
split -l 1000 big.log chunk_
# 按大小分割(每100MB)
split -b 100M bigfile chunk_
# 按行分割并生成数字后缀
split -l 1000 -d big.log chunk_
# 指定后缀长度
split -l 1000 -a 3 big.log chunk_
# 按行数分割CSV(保留表头)
head -n1 big.csv > header.csv
tail -n+2 big.csv | split -l 1000 - chunk_
# 合并分割文件
cat chunk_* > restored_file
常用参数
| 参数 | 说明 |
|---|---|
-l |
按行数分割 |
-b |
按字节大小分割 |
-d |
数字后缀(而非字母) |
-a |
后缀长度 |
六、文件权限与安全
62. setfacl / getfacl — ACL权限管理
getfacl — 查看ACL
# 查看文件ACL
getfacl file.txt
# 查看目录ACL
getfacl /data
setfacl — 设置ACL
# 给用户添加读写权限
setfacl -m u:username:rw file.txt
# 给组添加读取权限
setfacl -m g:groupname:r file.txt
# 删除用户ACL
setfacl -x u:username file.txt
# 递归设置目录ACL
setfacl -R -m u:username:rwx /data/
# 设置默认ACL(新文件继承)
setfacl -m d:u:username:rwx /data/
# 删除所有扩展ACL
setfacl -b file.txt
# 复制ACL到另一个文件
getfacl file1.txt | setfacl -set-file=- file2.txt
63. chattr / lsattr — 文件属性
lsattr — 查看属性
# 查看文件属性
lsattr file.txt
# 递归查看
lsattr -R /data/
chattr — 修改属性
# 设置为不可变(连root也不能删改)
chattr +i file.txt
# 解除不可变
chattr -i file.txt
# 只追加模式(只能添加不能修改删除)
chattr +a logfile.log
# 解除追加模式
chattr -a logfile.log
# 禁止文件更新访问时间
chattr +A file.txt
# 实时同步写入(类似sync)
chattr +S file.txt
# 允许文件数据崩溃安全
chattr +c file.txt
常用属性
| 属性 | 说明 |
|---|---|
a |
只追加 |
i |
不可变(不能被删除/修改) |
A |
不更新atime |
S |
同步写入 |
c |
自动压缩 |
s |
删除时安全擦除 |
u |
删除时保留数据(可恢复) |
64. umask — 默认权限掩码
基础语法
umask [掩码]
实例
# 查看当前umask
umask
# 设置umask(022表示新文件644,新目录755)
umask 022
# 设置umask为002(新文件664,新目录775)
umask 002
# 永久设置(写入~/.bashrc)
echo "umask 022" >> ~/.bashrc
umask计算
新文件权限 = 666 - umask
新目录权限 = 777 - umask
umask 022:
文件: 666 - 022 = 644 (rw-r--r--)
目录: 777 - 022 = 755 (rwxr-xr-x)
umask 002:
文件: 666 - 002 = 664 (rw-rw-r--)
目录: 777 - 002 = 775 (rwxrwxr-x)
65. chroot — 改变根目录
基础语法
chroot [选项] 新根目录 [命令]
实例
# 进入chroot环境
chroot /newroot /bin/bash
# 指定用户
chroot --userspec=user:group /newroot /bin/sh
# 在chroot中执行命令
chroot /newroot /bin/ls -l
# 结合mount准备环境
mount --bind /proc /newroot/proc
mount --bind /dev /newroot/dev
chroot /newroot /bin/bash
66. visudo — 安全编辑sudoers
基础语法
visudo [选项]
实例
# 编辑sudoers文件
visudo
# 检查语法(不编辑)
visudo -c
# 使用其他编辑器
visudo -e
# 指定文件
visudo -f /etc/sudoers.d/custom
sudoers配置示例
# 允许用户执行所有命令
username ALL=(ALL) ALL
# 允许用户执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart nginx
# 无密码执行特定命令
username ALL=(ALL) NOPASSWD: /usr/bin/reboot
# 组权限
%admin ALL=(ALL) ALL
%users ALL=(ALL) /usr/bin/apt
# 禁止执行
username ALL=(ALL) !/usr/bin/passwd root
67. openssl — 加密/证书管理
基础语法
openssl 命令 [选项] [参数]
实例
# 生成随机密码(32位)
openssl rand -base64 32
# 生成私钥
openssl genrsa -out private.key 2048
# 生成公钥
openssl rsa -in private.key -pubout -out public.key
# 生成自签名证书
openssl req -new -x509 -key private.key -out cert.crt -days 365
# 查看证书内容
openssl x509 -in cert.crt -text -noout
# 加密文件
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc
# 解密文件
openssl enc -d -aes-256-cbc -in file.enc -out file.txt
# 计算MD5
openssl md5 file.txt
# 计算SHA256
openssl sha256 file.txt
# 测试SSL连接
openssl s_client -connect google.com:443 -showcerts
# Base64编码
echo "hello" | openssl base64
# Base64解码
echo "aGVsbG8K" | openssl base64 -d
68. gpg — 文件加密签名
基础语法
gpg [选项] [文件]
实例
# 生成密钥对
gpg --gen-key
# 列出密钥
gpg --list-keys
# 对称加密文件
gpg -c file.txt
# 解密对称加密
gpg --decrypt file.txt.gpg > file.txt
# 非对称加密(使用接收者公钥)
gpg -e -r [email protected] file.txt
# 解密(使用私钥)
gpg -d file.txt.gpg > file.txt
# 签名
gpg -s file.txt
# 验签
gpg --verify file.txt.sig
# 导出公钥
gpg --export -a [email protected] > public.key
# 导入公钥
gpg --import public.key
# 清除签名
gpg --clearsign file.txt
七、系统信息与硬件
69. lscpu — CPU信息
基础语法
lscpu [选项]
实例
# 显示CPU信息
lscpu# 显示可解析格式
lscpu -e
# 显示CPU缓存
lscpu -C
# 显示扩展信息
lscpu --extended
# JSON格式
lscpu --json
70. lspci — PCI设备
基础语法
lspci [选项]
实例
# 列出所有PCI设备
lspci
# 详细信息
lspci -v
lspci -vv
# 树形显示
lspci -t
# 查看网卡
lspci | grep -i network
# 查看显卡
lspci | grep -i vga
# 以数字显示(不解析名称)
lspci -n
71. lsusb — USB设备
基础语法
lsusb [选项]
实例
# 列出所有USB设备
lsusb
# 详细信息
lsusb -v
# 树形显示
lsusb -t
# 指定设备
lsusb -s 001:002
72. lshw — 硬件配置
基础语法
lshw [选项]
实例
# 显示所有硬件
lshw
# 简要输出
lshw -short
# 显示指定类别
lshw -class cpu
lshw -class memory
lshw -class disk
lshw -class network
# HTML输出
lshw -html > hardware.html
# JSON输出
lshw -json > hardware.json
# 只显示可用的硬件
lshw -enable
73. dmidecode — 硬件DMI信息
基础语法
dmidecode [选项]
实例
# 显示所有信息
dmidecode
# 显示系统信息(型号/序列号)
dmidecode -t system
# 显示BIOS信息
dmidecode -t bios
# 显示内存信息
dmidecode -t memory
# 显示CPU信息
dmidecode -t processor
# 显示更少信息
dmidecode -s system-serial-number
dmidecode -s system-product-name
74. free — 内存使用
基础语法
free [选项]
实例
# 显示内存
free
# 人类可读
free -h
# 以MB显示
free -m
# 以GB显示
free -g
# 连续监控(每2秒)
free -s 2
# 显示总计行
free -t
# 显示低/高内存
free -l
# 旧式输出(兼容)
free -o
八、日志管理与调试
75. strings — 提取二进制文本
基础语法
strings [选项] 文件
实例
# 提取所有可打印字符串
strings /bin/ls
# 提取至少10字符的字符串
strings -n 10 /bin/ls
# 显示偏移量
strings -t x /bin/ls
# 从多个文件提取
strings *.so
# 搜索特定字符串
strings /usr/bin/nginx | grep version
76. hexdump — 十六进制查看
基础语法
hexdump [选项] 文件
实例
# 显示十六进制(规范格式)
hexdump -C file.bin
# 只显示十六进制(无ASCII)
hexdump -x file.bin
# 只显示ASCII
hexdump -c file.bin
# 单字节十六进制
hexdump -b file.bin
# 显示指定字节
hexdump -n 100 file.bin
# 跳过前10字节
hexdump -s 10 file.bin
77. od — 八进制/十六进制查看
基础语法
od [选项] 文件
实例
# 八进制显示(默认)
od file.txt
# 十六进制单字节
od -tx1 file.txt
# 十六进制双字节
od -tx2 file.txt
# 显示ASCII字符
od -c file.txt
# 跳过前16字节
od -j 16 file.txt
# 只显示前100字节
od -N 100 file.txt
78. objdump — 目标文件信息
基础语法
objdump [选项] 文件
实例
# 显示所有头信息
objdump -f /bin/ls
# 反汇编
objdump -d /bin/ls
# 显示符号表
objdump -t /bin/ls
# 显示动态符号
objdump -T /lib/libc.so.6
# 显示所有段
objdump -h /bin/ls
# 显示重定位信息
objdump -r /bin/ls
# 完整信息
objdump -a /bin/ls
79. readelf — ELF文件信息
基础语法
readelf [选项] 文件
实例
# 显示文件头
readelf -h /bin/ls
# 显示节表
readelf -S /bin/ls
# 显示程序头
readelf -l /bin/ls
# 显示动态节
readelf -d /bin/ls
# 显示符号表
readelf -s /bin/ls
# 显示所有
readelf -a /bin/ls
80. ldd — 动态库依赖
基础语法
ldd [选项] 程序
实例
# 查看程序依赖库
ldd /bin/ls
# 查看未知程序
ldd /usr/bin/nginx
# 仅显示缺失的库
ldd -d /bin/ls
# 显示版本信息
ldd -v /bin/ls
# 安全模式(不执行库)
ldd -r /bin/ls
九、Shell编程与辅助
81. printf — 格式化输出
基础语法
printf "格式" 参数...
实例
# 普通输出
printf "Hello %s\n" "World"
# 格式化数字
printf "%d %04d %+d\n" 1 2 3
# 格式化字符串(左对齐)
printf "%-10s %5d\n" "Name" 100
# 浮点数
printf "%.2f\n" 3.14159
# 转义字符
printf "Tab\t新行\n"
# 输出到变量
printf -v var "%s %s" "Hello" "World"
echo $var
# 十六进制/八进制
printf "0x%02X\n" 255
printf "0%o\n" 8
82. read — 读取输入
基础语法
read [选项] [变量名]
实例
# 读取一行
read var
echo $var
# 带提示符
read -p "请输入名字: " name
# 读取密码(不显示)
read -s -p "密码: " password
# 读取多个变量
read first last age
# 读取数组
read -a array
# 限制字符数
read -n 5 input
# 读取文件
while read line; do
echo $line
done < file.txt
# 超时
read -t 5 input
# 分隔符
read -d ':' field1 field2
83. export — 环境变量
基础语法
export [选项] [变量=值]
实例
# 设置并导出变量
export PATH=$PATH:/usr/local/bin
# 设置变量(不导出,仅shell内有效)
var=value
# 导出已有变量
export var
# 查看所有环境变量
export -p
# 删除环境变量
export -n var
# 临时环境变量(仅对当前命令有效)
LANG=en_US.UTF-8 ls
84. env — 环境变量管理
基础语法
env [选项] [变量=值] [命令]
实例
# 显示所有环境变量
env
# 在干净环境中执行(无环境变量)
env -i /bin/bash
# 设置变量执行命令
env LANG=zh_CN.UTF-8 ./script.sh
# 删除环境变量
env -u PATH ./script.sh
# 显示指定变量
env | grep PATH
# 排序输出
env | sort
85. source — 在shell中执行脚本
基础语法
source 脚本
. 脚本 # 简写
实例
# 加载配置文件
source ~/.bashrc
# 在shell中执行脚本(变量保留)
source ./setup.sh
# 等价于
. ./setup.sh
# 加载函数库
source ./lib/functions.sh
my_function
# 使用相对路径
. ./env.sh
对比区别
# source:在当前shell执行,变量改变会保留
source script.sh
echo $var # 能看到
# 直接执行:子shell执行,变量改变不保留
./script.sh
echo $var # 看不到
86. exec — 替换当前shell
基础语法
exec [命令] [参数]
实例
# 替换当前shell为其他shell
exec /bin/zsh
# 在脚本中重定向所有输出
exec > log.txt 2>&1
echo "这行会写入log.txt"
# 在脚本中重定向输入
exec < input.txt
# 创建文件描述符
exec 3<> file.txt
echo "写入fd3" >&3
# 关闭文件描述符
exec 3>&-
87. set — 设置shell选项
基础语法
set [选项] [位置参数]
实例
# 开启调试模式(详细执行)
set -x
ls -l
set +x # 关闭
# 遇错退出(脚本安全)
set -e
command_that_fails # 脚本在此退出
echo "不会执行"
# 未定义变量报错
set -u
echo $undefined_var # 报错
# 管道中任意命令失败即退出
set -o pipefail
false | echo "hello" # 退出
# 显示当前设置
set -o
# 位置参数赋值
set -- arg1 arg2 arg3
echo $1 # arg1
常用选项
| 选项 | 说明 |
|---|---|
-x |
调试模式(显示执行命令) |
-e |
命令失败时立即退出 |
-u |
使用未定义变量时报错 |
-v |
显示读取的输入行 |
-o pipefail |
管道中任一命令失败即退出 |
88. shopt — bash内置选项
基础语法
shopt [选项] [选项名]
实例
# 列出所有选项
shopt
# 开启选项
shopt -s extglob
shopt -s histappend
shopt -s dotglob
# 关闭选项
shopt -u extglob
# 查看特定选项
shopt extglob
常用选项
| 选项 | 说明 |
|---|---|
extglob |
扩展通配符 |
histappend |
历史记录追加而非覆盖 |
dotglob |
通配符匹配隐藏文件 |
nocaseglob |
通配符忽略大小写 |
nullglob |
无匹配时返回空而非原样 |
89. alias — 命令别名
基础语法
alias [别名=命令]
实例
# 创建别名
alias ll='ls -alh'
alias grep='grep --color=auto'
alias rm='rm -i' # 交互删除(防误删)
alias mkdir='mkdir -pv'
# 查看所有别名
alias
alias -p
# 删除别名
unalias ll
# 删除所有别名
unalias -a
# 绕过别名
\ls # 使用原始ls
command ls # 使用原始ls
永久保存
# 写入 ~/.bashrc
echo "alias ll='ls -alh'" >> ~/.bashrc
echo "alias grep='grep --color=auto'" >> ~/.bashrc
source ~/.bashrc
90. type — 显示命令类型
基础语法
type [选项] 命令
实例
# 显示命令类型
type ls
type cd
type ifconfig
# 显示所有匹配(别名、函数、内置、外部)
type -a ls
# 只显示文件路径(外部命令)
type -p ls
# 跳过别名查找
type -t ls # 返回alias/function/builtin/file
91. command — 忽略别名和函数
基础语法
command [选项] 命令 [参数]
实例
# 忽略别名执行原始命令
command ls
# 查找命令路径(不执行)
command -v ls
# 显示命令路径(类似which)
command -V ls
# 在PATH中查找(不包含shell函数)
command -p ls
92. time — 测量执行时间
基础语法
time [选项] 命令
实例
# 测量命令耗时
time ls -R /
# 测量脚本
time ./long_task.sh
# 详细输出(GNU time)
/usr/bin/time -v ./script.sh
# 输出到文件
/usr/bin/time -o time.log ./script.sh
# 指定输出格式
/usr/bin/time -f "耗时 %E, CPU %P" ./script.sh
输出说明
| 字段 | 说明 |
|---|---|
real |
总耗时(墙钟时间) |
user |
用户态CPU时间 |
sys |
内核态CPU时间 |
93. yes — 重复输出
基础语法
yes [字符串]
实例
# 输出y(用于自动确认)
yes | rm -i *.tmp
# 输出指定字符串
yes "Hello" | head -n 5
# 填充文件
yes | head -n 1000 > bigfile.txt
# 配合多命令
yes n | ./interactive_script.sh
# 无限输出到/dev/null(测试CPU)
yes > /dev/null
94. watch — 定时执行
基础语法
watch [选项] 命令
实例
# 每2秒查看进程
watch 'ps aux | grep nginx'
# 每5秒查看磁盘
watch -n 5 'df -h'
# 高亮变化
watch -d 'ls -l'
# 不显示标题
watch -t 'date'
# 查看日志(watch + tail)
watch -n 1 'tail -n 10 app.log'
# 查看网络连接
watch 'ss -tlnp'
# 查看内存
watch 'free -h'
# 查看负载
watch 'uptime'
常用参数
| 参数 | 说明 |
|---|---|
-n |
刷新间隔(秒,默认2) |
-d |
高亮显示变化 |
-t |
不显示标题行 |
-b |
命令失败时响铃 |
95. script — 记录终端会话
基础语法
script [选项] [文件]
实例
# 开始记录会话
script session.log
# ... 执行命令 ...
exit # 退出记录
# 追加到文件
script -a session.log
# 静默模式(不显示启动消息)
script -q session.log
# 记录命令执行
script -c "ls -l" ls.log
# 记录时间戳
script -t 2> timing.log session.log
# 回放(需scriptreplay)
scriptreplay timing.log session.log
十、压缩归档(补充)
96. bzip2 / bunzip2 — BZ2压缩
基础语法
bzip2 [选项] 文件
bunzip2 [选项] 文件.bz2
实例
# 压缩文件(生成.bz2)
bzip2 file.txt
# 保留原文件
bzip2 -k file.txt
# 解压
bunzip2 file.txt.bz2
# 强制解压(覆盖)
bunzip2 -f file.txt.bz2
# 测试压缩文件完整性
bzip2 -t file.txt.bz2
# 显示压缩率
bzip2 -v file.txt
# 压缩级别(1-9,默认9)
bzip2 -9 file.txt
97. xz / unxz — XZ高压缩率
基础语法
xz [选项] 文件
unxz [选项] 文件.xz
实例
# 压缩文件(高压缩率,较慢)
xz file.txt
# 保留原文件
xz -k file.txt
# 解压
unxz file.txt.xz
xz -d file.txt.xz # 等价
# 压缩级别(0-9,默认6)
xz -9 file.txt
# 测试完整性
xz -t file.txt.xz
# 查看压缩信息
xz -l file.txt.xz
# 多线程压缩(需支持)
xz -T 4 file.txt
# 极速压缩(级别1)
xz -1 -k file.txt
98. 7z — 7-Zip压缩
基础语法
7z [命令] [选项] 压缩包 文件...
实例
# 创建7z压缩
7z a archive.7z file1 file2
# 创建带密码的压缩
7z a -p密码 archive.7z file.txt
# 解压
7z x archive.7z -o/path/to/extract
# 列出压缩包内容
7z l archive.7z
# 测试完整性
7z t archive.7z
# 创建ZIP格式
7z a -tzip archive.zip file.txt
# 创建GZIP格式
7z a -tgzip archive.gz file.txt
# 最大压缩
7z a -mx=9 archive.7z file.txt
99. zcat / zgrep — 查看压缩文件
基础语法
zcat 文件.gz
zgrep [grep选项] 模式 文件.gz
实例
# 查看gz文件(不解压)
zcat file.gz
# 查看多个gz
zcat *.gz
# 在gz中搜索
zgrep ERROR app.log.gz
# 带行号搜索
zgrep -n ERROR app.log.gz
# 递归搜索所有gz
zgrep -r ERROR /var/log/
# 管道处理
zcat log.gz | grep ERROR | wc -l
# 查看xz文件(需xzcat)
xzcat file.xz
# 查看bz2文件(需bzcat)
bzcat file.bz2
100. tar — 完整参数汇总
基础语法
tar [选项] [归档文件] [源文件]
创建归档
# 创建tar归档
tar -cvf archive.tar /path
# 创建gz压缩
tar -zcvf archive.tar.gz /path
# 创建bz2压缩
tar -jcvf archive.tar.bz2 /path
# 创建xz压缩
tar -Jcvf archive.tar.xz /path
# 排除文件
tar -zcvf backup.tar.gz --exclude='*.log' /data
解压归档
# 解压tar
tar -xvf archive.tar
# 解压gz
tar -zxvf archive.tar.gz
# 解压bz2
tar -jxvf archive.tar.bz2
# 解压xz
tar -Jxvf archive.tar.xz
# 解压到指定目录
tar -zxvf archive.tar.gz -C /target
# 只解压特定文件
tar -zxvf archive.tar.gz file.txt
查看内容
# 查看归档内容
tar -tvf archive.tar
# 查看gz归档内容
tar -tzvf archive.tar.gz
常用参数
| 参数 | 说明 |
|---|---|
-c |
创建归档 |
-x |
解压归档 |
-t |
查看内容 |
-v |
详细输出 |
-f |
指定归档文件 |
-z |
gzip压缩 |
-j |
bzip2压缩 |
-J |
xz压缩 |
-C |
指定目标目录 |
--exclude |
排除文件 |
以上就是全部100个进阶命令的详细用法示例,涵盖了进程、网络、磁盘、性能、文本、权限、硬件、日志、Shell和压缩十个大类,对于各位NLer来说应该够用了,那天需要用到的时候记得来翻看一下。