一、网络常用命令
1.ss(Socket Statistics)
ss 直接从内核空间获取信息,比遍历 /proc 的 netstat 快得多,尤其在连接数巨大的高并发场景下。
常用组合
最常用的参数是:-tulnp
-t(tcp): 显示 TCP 连接-u(udp): 显示 UDP 连接-l(listening): 仅显示处于监听状态的 socket(默认只显示已建立的连接)-n(numeric): 不解析服务名(如显示 22 而不是 ssh,显示 IP 而不是域名),极大提升速度-p(process): 显示哪个进程在使用该 socket(需要 sudo 权限)
场景化实战
-
查看本机开启了哪些 端口 (服务):
ss -tulnp
-
查看所有已建立的连接(不含监听):
arduinoss -tan- (注意去掉 -l,保留 -a 表示 all,或者直接不加 -l)
-
统计连接状态(非常有用,看服务器负载):
ss -s- 输出会告诉你当前有多少个 TCP 连接,多少个处于 ESTABLISHED,多少个 TIME-WAIT。
-
高级过滤(骚操作):
- 查找所有连接到远程 8080 端口的连接:
ss -nt dst :8080- 查找状态为"已建立"的连接:
perlss -t state established- 查找状态为 TIME-WAIT 的连接(排查高并发连接释放问题):
perlss -t state time-wait
前世前辈 ------ netstat
虽然已被 ss 取代,但很多老系统或脚本中依然存在,必须看懂。
- 常用组合:
netstat -tulnp(参数含义与 ss 完全一致) - 核心区别:
netstat如果不加-n,会尝试反向解析 DNS,导致命令卡顿半天,切记加上-n。 - 查看 路由表 :
netstat -rn(现在推荐用ip route)
2.lsof (List Open Files)
在 Linux 中"一切皆文件",网络 Socket 也是文件。ss 是从网络角度看进程,lsof 是从文件/进程角度看网络。
核心参数
-i: 列出符合条件的网络文件-p: 指定 PID-n: 不解析主机名(提速)
场景化实战
- 谁占用了 80 端口 ?(比 ss 更直观地找凶手)
css
lsof -i :80
-
某个进程( PID 1234)打开了哪些网络连接?
csslsof -p 1234 -a -i- (
-a表示 AND,即同时满足 PID 1234 和 网络连接)
- (
-
查看特定用户的网络活动:
css
lsof -u username -i
- 恢复删除的文件(高阶技巧): 如果日志文件被
rm了但进程没重启,空间不释放,可以用lsof | grep deleted找到句柄恢复。
3.ip & tcpdump
1. ip 命令 (iproute2 套件)
用来取代 ifconfig 和 route。
-
查看 IP 地址:
cssip addr (或 ip a)- 对比 ifconfig ,它能看到 secondary **IP 。
-
查看/操作 路由表 :
ip route
-
查看网络邻居 ( ARP 表):
ip neigh
-
查看接口统计(丢包、错误):
bash
ip -s link
2. tcpdump (网络抓包神器)
当 ss 告诉你连接存在,但通不通、数据对不对时,就需要抓包。
- 基础 抓包 (抓 eth0 网卡 ):
css
tcpdump -i eth0
- 生产环境防刷屏(重要):
css
tcpdump -i eth0 -nn port 80
- 抓特定 IP 的包:
css
tcpdump -i eth0 host 192.168.1.5
- 保存为文件(供 Wireshark 分析):
css
tcpdump -i eth0 -w capture.pcap
4. nc & curl------网络连通性测试
1. nc (Netcat) - 网络瑞士军刀
-
测试 端口 通不通(替代 telnet ):
nc -v -z 192.168.1.1 80
-
临时建立一个聊天/传输通道:
- 服务端:
nc -l 1234 - 客户端:
nc IP地址 1234
- 服务端:
2. curl - HTTP 测试
1.基本使用与输出控制
- 查看详细的连接过程( DNS 耗时、握手耗时):
swift
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTotal: %{time_total}s\n" -o /dev/null -s http://www.google.com
- 测试由 Header 引起的访问问题:
arduino
curl -I http://example.com
( -I 只抓取 Header)
2.HTTP 请求定制
指定方法:
arduino
curl -X POST https://api.example.com/items
说明: 强制请求方法。多数情况下用 -d 会自动变成 POST。
- 请求头:
arduino
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
https://api.example.com/items
说明: -H添加自定义头。适合模拟前端/客户端请求。
- 发送表单或 JSON :
json
# x-www-form-urlencoded
curl -d "name=alice&age=30" https://api.example.com/users
# JSON
curl -H "Content-Type: application/json" \
-d '{"name":"alice","age":30}' \
https://api.example.com/users
说明: -d会设置 Content-Type 为表单并切换到 POST;发送 JSON 时需手动设头。
- 多部分上传(文件):
arduino
curl -F "file=@/path/to/report.pdf" \
-F "meta=Q3" \
https://api.example.com/upload
说明: -F按 multipart/form-data 上传文件与字段。
- Cookies:
代码
arduino
curl --cookie "sid=abc123" https://example.com
curl --cookie-jar cookies.txt https://example.com/login
curl --cookie cookies.txt https://example.com/profile
说明: 管理会话或跨请求登录态。
- 压缩与解压:
代码
arduino
curl --compressed https://api.example.com/list
- 说明: 自动协商并解压 gzip/deflate 响应
3.认证、代理与安全
- 基本认证:
arduino
curl -u username:password https://api.example.com/private
- Bearer 令牌:
arduino
curl -H "Authorization: Bearer <token>" https://api.example.com/private
- 代理(HTTP/ SOCKS):
bash
curl -x http://proxy.local:8080 https://example.com
curl --socks5-hostname 127.0.0.1:1080 https://example.com
- TLS 选项(谨慎使用):
bash
curl --cacert ca.pem https://secure.example.com
curl -k https://self-signed.local # 跳过证书校验(不建议生产)
4.下载、续传与性能
- 断点续传:
arduino
curl -C - -O https://example.com/bigfile.zip
- 限速与并发(进阶):
arduino
curl --limit-rate 1M -O https://example.com/video.mp4
- 只取响应头:
arduino
curl -I https://example.com
- 详细调试输出:
c
curl -v https://example.com
curl --trace-ascii trace.log https://example.com
diff
-X 指定方法(GET/POST/PUT/PATCH/DELETE)
-H 添加请求头
-d 发送请求体(表单或 JSON)并切换为 POST
-F 发送 multipart/form-data(文件/字段)
-I 仅请求响应头
-L 跟随重定向
-o/-O 保存输出(自定义/远端文件名)
-C - 断点续传
-u 基本认证
--cookie/--cookie-jar Cookies 管理
--compressed 启用压缩
-x/--socks5-hostname 代理
-k/--cacert TLS 校验控制
-s/-v/--trace 静默/详细/跟踪
--limit-rate 限速
--max-time 全局超时
--retry/--retry-delay/--retry-max-time 自动重试策略
--data-urlencode 对表单字段进行 URL 编码
--http2/--http3 指定协议版本(依平台构建而定)
大量文件下载、断点续传、递归镜像网站、后台任务:选 wget。
-
Level 1 (生存必备):
ss -tulnp(看端口)ip a(看IP)ping(看连通性)
-
Level 2 (运维排障):
lsof -i :端口号(查占用)curl -v(调试 HTTP)ss -s(看连接概况)
-
Level 3 (专家调试):
tcpdump -nn ...(抓包分析)ss state established(精细化连接分析)
二、资源管理常用命令
1.top & htop
经典老将:top
所有 Linux 发行版必带,必须熟练掌握交互快捷键。
-
常用启动:
csstop- (或者
top -c显示完整的命令行路径,而不仅仅是进程名)
- (或者
-
交互式快捷键(神器):
1(数字1): 展开显示所有 CPU 核心的负载(看是不是单核被打满)。M(Shift+m): 按 内存 使用率排序(找内存泄漏)。P(Shift+p): 按 CPU 使用率排序(默认)。c: 切换显示完整命令路径。k: 输入 PID 杀死进程。
-
关键指标解读:
-
Load Average:
1.00, 0.50, 0.20(1分钟、5分钟、15分钟平均负载)。- 经验值:如果数值超过了 CPU 核心数,说明系统过载了。
-
%Cpu(s):
us(user): 用户空间占用(高通常是业务代码运算多)。sy(system): 内核空间占用(高通常是系统调用多,如频繁 I/O)。wa(iowait): 等待磁盘 I/O 的时间(重点!如果这个高,说明磁盘是瓶颈)。
-
视觉系新秀:htop
如果系统允许安装,强烈推荐 用 htop 代替 top。它支持鼠标点击、颜色区分、图形化显示 CPU 条,直观度大幅提升。
2. free------内存管理
当你怀疑服务器变慢是因为内存不足时,看这里。
常用命令
- 以人类可读格式查看 内存 :
c
free -h
-
如何判断 内存 真不够了? 不要只看
free那一列!Linux 喜欢把空闲内存拿来做缓存。- 重点看
available这一列: 这才是你真正应用程序可以调用的剩余内存。 - 看
buff/cache: 如果这部分很大,free 很小,通常没事,系统会自动释放 cache 给程序用。 - 看
Swap: 如果Swap的used很大且在不断变化,说明内存严重不足,系统在频繁读写硬盘交换区,由于硬盘速度远慢于内存,机器会卡死。
- 重点看
3.df & du------ 磁盘空间与文件
这两个命令区别在于df 看房子的总面积,du 看某个房间里的家具占地。
1. df (Disk Free) - 宏观视角
- 查看磁盘挂载点和使用率:
bash
df -Th
-
排查问题: 如果
df -h显示磁盘没满,但无法写入文件,可能是 Inode 满了(小文件太多)。- 查看 Inode 使用率:
df -i
- 查看 Inode 使用率:
2. du (Disk Usage) - 微观视角
- 当前目录下哪个文件夹最大?(找出吃磁盘的元凶):
bash
du -sh * | sort -rh
4.iostat & iotop ------ 磁盘 I/O 瓶颈
当 top 里的 %wa (iowait) 很高时,用这组命令抓出是谁在疯狂读写硬盘。
1. iostat (属于 sysstat 包)
-
查看所有磁盘的吞吐和繁忙度(黄金参数):
iostat -xz 1
-
核心指标解读:
%util: 磁盘利用率。如果接近 100%,说明磁盘已经满负荷运转,必须优化或换盘。await: I/O 请求的平均等待时间(毫秒)。如果这个值很大(如 >10ms 甚至上百),说明磁盘响应慢。
2. iotop
类似于 top,但是专门按 磁盘 I/O 排序进程。
-
查看是谁在读写硬盘:
iotop -o
5. vmstat & dmesg------系统综合快照
1. vmstat (Virtual Memory Statistics)
虽然名字叫虚拟内存,但它其实是查看 CPU、内存、I/O 的综合报表,适合脚本监控。
-
每秒刷新一次系统状态:
vmstat 1
2. dmesg (Kernel Ring Buffer)
- 查看内核日志(硬件故障、 OOM Killer): 如果进程突然莫名其妙消失了,很可能是内存溢出被系统杀掉了。
perl
dmesg -T | grep -i "kill"
-
Level 1 (系统卡顿先看它):
top(看 Load Average, CPU %, wait %)free -h(看内存剩多少,Swap 用没用)df -Th(看磁盘是不是满了)
-
Level 2 (找出谁在捣乱):
du -sh *(磁盘满了,找大文件)iotop(磁盘慢了,找读写进程)top按M(找吃内存进程)
-
Level 3 (深层分析):
iostat -xz 1(分析磁盘具体的饱和度)dmesg | grep error(看有没有硬件报错)sar(查看历史性能数据,如果不安装 sysstat 包可能没有)
一个小技巧: 如果你发现系统很慢,但 CPU、内存、磁盘 I/O 看起来都正常,请检查 打开文件数限制 : ulimit -n
Ulimit -a显示当前所有资源限制 很多时候服务起不来或者报错,是因为达到了最大文件句柄限制(默认通常是 1024,生产环境通常需要调大)。
三、搜索常用命令
1.grep内容搜索
1.基础搜索
最常用的场景:在一个文件或一堆文件里找个关键词。
- 黄金组合参数:
-rni
-r(recursive): 递归查找,不光找当前目录,还找子目录。-n(line number): 显示行号,告诉你关键词在哪一行。-i(ignore case): 忽略大小写(找 "Error" 时也能把 "error" 揪出来)。
- 场景化实战
- 在当前目录及子目录下,查找所有包含 "password" 的文件:
perl
grep -rni "password" .
- 在单个文件中查找:
perl
grep -i "error" /var/log/syslog
2.上下文控制
这是 grep 最强大的功能之一。当你搜到 "Exception" 时,只看这一行通常没用,你需要看它上面 发生了什么,以及下面的堆栈信息。
- 记忆口诀:ABC
-A(After): 显示匹配行之后的 n 行。-B(Before): 显示匹配行之前的 n 行。-C(Context): 显示匹配行前后各 n 行。
- 场景化实战
- 查看报错后的 10 行堆栈信息(最常用):
csharp
grep -A 10 "NullPointerException" catalina.out
- 查看报错前后各 5 行,分析上下文:
c
grep -C 5 "Critical Error" application.log
3.精准过滤
有时候搜出来的东西太多,或者太模糊,需要提纯。
- 反向过滤:
-v(Invert)
- 场景: 查看配置文件,但是不想看被
#注释掉的行,也不想看空行。
bash
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
- 精确单词匹配:
-w(Word)
- 场景: 你想搜变量
is,但grep会把this,list,history全给你搜出来。
perl
grep -w "is" code.py
- 只要匹配的内容:
-o(Only matching)
- 场景: 只需要提取日志中的 IP 地址,不需要整行内容。
css
grep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" access.log
4.统计与文件名 ------ 宏观视角
- 只看文件名:
-l(List)
- 场景: 你不需要看代码具体内容,只想知道哪些文件 里调用了
getUserInfo这个函数。
bash
grep -r -l "getUserInfo" ./src
- 统计出现次数:
-c(Count)
- 场景: 今天发生了多少次 404 错误?
c
grep -c "404 Not Found" access.log
5.高阶正则 ------ -E & -F
- 扩展正则:
-E(Extended)
默认的 grep 支持的基础正则比较弱,使用 | (或)、+ (一个或多个) 等符号时需要转义。加上 -E 就解放了(相当于命令 egrep)。
- 同时搜两个关键词("Error" 或者 "Warning"):
c
grep -E "Error|Warning" app.log
- 搜 8000 到 8999 的端口号:
arduino
grep -E "8[0-9]{3}" config.xml
- 固定字符串:
-F(Fixed)
- 场景: 你要搜索的内容里包含大量的
.*[等特殊字符,你不想让 grep 把它们当正则处理,只想当普通字符搜。 - 优势: 速度极快。
perl
grep -F "user[0]" script.sh
按照使用频率排序的学习路径:
-
Level 1 (每天都用):
grep "text" file(基础搜)grep -rni "text" .(递归搜代码/配置)ps aux | grep java(查进程,配合管道)
-
Level 2 (日志分析):
grep -v "info" log(排除干扰信息)grep -A 10 "error" log(看报错堆栈)grep -E "error|warn" log(搜多个词)
-
Level 3 (数据提取):
grep -o(配合正则提取 IP、邮箱)grep -l(只找文件名,配合xargs做批量修改)
一个经典的"骚操作"组合: 找出所有包含 "TODO" 的代码文件,并显示行号,最后只保留最近修改过的文件(需配合 ls 或 find,这里展示 grep 配合管道):
ini
# 在当前目录递归搜 TODO,显示颜色,显示行号
grep -rni --color=auto "TODO" .
小贴士: 如果你的文件是二进制文件 (在这堆乱码里搜字符串),grep 可能会提示 "Binary file matches"。加上 -a 参数可以将二进制文件当作文本文件处理: grep -a "string" binary_file
2.find文件搜索
基础搜索:名字与类型
- 按文件名找(最常用):
arduino
find /etc -name "nginx.conf"
- 只找目录或文件:
lua
find . -type d -name "config"
时间角度:按时间搜索
这是运维排查问题的核心技能。比如:找最近被黑客修改过的文件,或者找一年前的旧日志删除。
-
参数口诀:
-mtime(Modify Time): 内容修改时间。-n: n 天以内(Newer)。+n: n 天以前(Older)。
-
场景化实战:
- 找最近 24 小时内被修改过的文件:
arduinofind /var/www -mtime -1- 找 7 天以前的旧日志:
luafind /var/log -name "*.log" -mtime +7
空间管理:按大小搜索
- 找大文件(清理磁盘必备):
matlab
find / -type f -size +100M
骚操作:搜索并执行 (-exec)
找到文件只是第一步,通常我们还要删掉它、移动它或修改它。
- 找到 7 天前的日志并直接删除(慎用):
bash
find /var/log -name "*.log" -mtime +7 -exec rm -f {} ;
- 性能优化版(推荐): 配合
xargs当文件成千上万时,-exec会启动成千上万个rm进程,极慢。用xargs可以把文件名打包一次性传给rm。
arduino
find . -name "*.log" | xargs rm -f
5.极速闪电 ------ locate
如果你觉得 find 太慢(因为它要扫描磁盘),可以用 locate。
- 原理: 它不扫磁盘,而是查一个系统自带的数据库(通常在
/var/lib/mlocate/mlocate.db)。 - 缺点: 新建的文件可能搜不到,因为数据库通常每天只更新一次。
- 常用命令
-
秒级搜索文件:
locate nginx.conf
-
我要搜刚创建的文件怎么办? 先手动更新数据库,再搜:
sudo updatedb
locate new_file.txt
3.命令寻踪 ------ which / whereis / type
这三个命令专门用来找"命令"本身在哪里。
1. which (我到底在用哪个版本?)
- 场景: 你装了 python2 和 python3,输入
python到底运行的是哪一个?
bash
which python
- 原理: 它只在环境变量
$PATH里找可执行文件。
2. whereis (全家桶)
-
场景: 我不光想找二进制文件,还想找它的源代码 和帮助文档(Man page)在哪里。
whereis nginx
3. type (验明正身)
- 场景: 为什么
ls有颜色?为什么cd找不到文件?
bash
type ls
bash
type cd
按照使用频率 和场景记忆:
-
Level 1 (文件去哪了):
locate filename: 只要大概记得名字,先用这个,最快。find . -name "filename":locate找不到或者是刚建的文件,用这个。
-
Level 2 (运维清理与排查):
find . -mtime -1: 昨天谁改了文件?(查被黑/查故障)。find . -size +1G: 磁盘怎么满了?(查大文件)。find ... | xargs rm: 批量删除旧文件。
-
Level 3 (环境调试):
which java: 查环境变量配置对不对。type ll: 查这个命令到底是个啥。
一个核心区别:
grep是在书中(文件内容)里找句子。find是在图书馆(文件系统)里找书**。**