运维常用基础&进阶命令(持续更新)

136 阅读13分钟

一、网络常用命令

第一部分:ss(Socket Statistics)

ss 直接从内核空间获取信息,比遍历 /procnetstat 快得多,尤其在连接数巨大的高并发场景下。

  1. 常用组合

最常用的参数是:-tulnp

  • -t (tcp): 显示 TCP 连接
  • -u (udp): 显示 UDP 连接
  • -l (listening): 仅显示处于监听状态的 socket(默认只显示已建立的连接)
  • -n (numeric): 不解析服务名(如显示 22 而不是 ssh,显示 IP 而不是域名),极大提升速度
  • -p (process): 显示哪个进程在使用该 socket(需要 sudo 权限)
  1. 场景化实战

  • 查看本机开启了哪些 端口 (服务):
ss -tulnp
  • 查看所有已建立的连接(不含监听):

    • ss -tan
      
    • (注意去掉 -l,保留 -a 表示 all,或者直接不加 -l)
  • 统计连接状态(非常有用,看服务器负载):

    • ss -s
      
    • 输出会告诉你当前有多少个 TCP 连接,多少个处于 ESTABLISHED,多少个 TIME-WAIT。
  • 高级过滤(骚操作):

    • 查找所有连接到远程 8080 端口的连接:
    • ss -nt dst :8080
      
    • 查找状态为“已建立”的连接:
    • ss -t state established
      
    • 查找状态为 TIME-WAIT 的连接(排查高并发连接释放问题):
    • ss -t state time-wait
      

前辈 —— netstat

虽然已被 ss 取代,但很多老系统或脚本中依然存在,必须看懂。

  • 常用组合: netstat -tulnp (参数含义与 ss 完全一致)
  • 核心区别: netstat 如果不加 -n,会尝试反向解析 DNS,导致命令卡顿半天,切记加上 -n
  • 查看 路由表 netstat -rn (现在推荐用 ip route)

第二部分:lsof (List Open Files)

在 Linux 中“一切皆文件”,网络 Socket 也是文件。ss 是从网络角度看进程,lsof 是从文件/进程角度看网络。

  1. 核心参数

  • -i: 列出符合条件的网络文件
  • -p: 指定 PID
  • -n: 不解析主机名(提速)
  1. 场景化实战

  • 谁占用了 80 端口 ?(比 ss 更直观地找凶手)
lsof -i :80
  • 某个进程( PID 1234)打开了哪些网络连接?

    • lsof -p 1234 -a -i
      
    • ( -a 表示 AND,即同时满足 PID 1234 和 网络连接)
  • 查看特定用户的网络活动:

lsof -u username -i
  • 恢复删除的文件(高阶技巧): 如果日志文件被 rm 了但进程没重启,空间不释放,可以用 lsof | grep deleted 找到句柄恢复。

第三部分:ip & tcpdump

1. ip 命令 (iproute2 套件)

用来取代 ifconfigroute

  • 查看 IP 地址:

    • ip addr (或 ip a)
      
    • 对比 ifconfig ,它能看到 secondary IP
  • 查看/操作 路由表

ip route
  • 查看网络邻居 ( ARP 表):
ip neigh
  • 查看接口统计(丢包、错误):
ip -s link

2. tcpdump (网络抓包神器)

ss 告诉你连接存在,但通不通、数据对不对时,就需要抓包。

  • 基础 抓包 (抓 eth0 网卡 ):
tcpdump -i eth0
  • 生产环境防刷屏(重要):
tcpdump -i eth0 -nn port 80
  • 抓特定 IP 的包:
tcpdump -i eth0 host 192.168.1.5
  • 保存为文件(供 Wireshark 分析):
tcpdump -i eth0 -w capture.pcap

第四部分: 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耗时、握手耗时):
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTotal: %{time_total}s\n" -o /dev/null -s http://www.google.com
  • 测试由 Header 引起的访问问题:
curl -I http://example.com

( -I 只抓取 Header)

2.HTTP 请求定制

指定方法:

curl -X POST https://api.example.com/items

说明: 强制请求方法。多数情况下用 -d 会自动变成 POST。

  • 请求头:
curl -H "Content-Type: application/json" \
     -H "Authorization: Bearer <token>" \
     https://api.example.com/items

说明: -H添加自定义头。适合模拟前端/客户端请求。

  • 发送表单或 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 时需手动设头。

  • 多部分上传(文件):
curl -F "file=@/path/to/report.pdf" \
     -F "meta=Q3" \
     https://api.example.com/upload

说明: -F按 multipart/form-data 上传文件与字段。

  • Cookies:
curl --cookie "sid=abc123" https://example.com
curl --cookie-jar cookies.txt https://example.com/login
curl --cookie cookies.txt https://example.com/profile

说明: 管理会话或跨请求登录态。

  • 压缩与解压:

代码

curl --compressed https://api.example.com/list
  • 说明: 自动协商并解压 gzip/deflate 响应
3.认证、代理与安全
  • 基本认证:
curl -u username:password https://api.example.com/private
  • Bearer 令牌:
curl -H "Authorization: Bearer <token>" https://api.example.com/private
  • 代理(HTTP/ SOCKS):
curl -x http://proxy.local:8080 https://example.com
curl --socks5-hostname 127.0.0.1:1080 https://example.com
  • TLS 选项(谨慎使用):
curl --cacert ca.pem https://secure.example.com
curl -k https://self-signed.local    # 跳过证书校验(不建议生产)
4.下载、续传与性能
  • 断点续传:
curl -C - -O https://example.com/bigfile.zip
  • 限速与并发(进阶):
curl --limit-rate 1M -O https://example.com/video.mp4
  • 只取响应头:
curl -I https://example.com
  • 详细调试输出:
curl -v https://example.com
curl --trace-ascii trace.log https://example.com
-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。

  1. Level 1 (生存必备):

    1. ss -tulnp (看端口)
    2. ip a (看IP)
    3. ping (看连通性)
  2. Level 2 (运维排障):

    1. lsof -i :端口号 (查占用)
    2. curl -v (调试 HTTP)
    3. ss -s (看连接概况)
  3. Level 3 (专家调试):

    1. tcpdump -nn ... (抓包分析)
    2. ss state established (精细化连接分析)

二、资源管理常用命令

第一部分:top & htop

  1. 经典老将:top

所有 Linux 发行版必带,必须熟练掌握交互快捷键。

  • 常用启动:

    • top
      
    • (或者 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 的时间(重点!如果这个高,说明磁盘是瓶颈)。
  1. 视觉系新秀:htop

如果系统允许安装,强烈推荐htop 代替 top。它支持鼠标点击、颜色区分、图形化显示 CPU 条,直观度大幅提升。

第二部分: free——内存管理

当你怀疑服务器变慢是因为内存不足时,看这里。

  1. 常用命令

  • 以人类可读格式查看内存:
free -h
  • 如何判断内存真不够了? 不要只看 free 那一列!Linux 喜欢把空闲内存拿来做缓存。

    • 重点看 available 这一列: 这才是你真正应用程序可以调用的剩余内存。
    • buff/cache 如果这部分很大,free 很小,通常没事,系统会自动释放 cache 给程序用。
    • Swap 如果 Swapused 很大且在不断变化,说明内存严重不足,系统在频繁读写硬盘交换区,由于硬盘速度远慢于内存,机器会卡死。

第三部分:df & du—— 磁盘空间与文件

这两个命令区别在于df 看房子的总面积,du 看某个房间里的家具占地。

1. df (Disk Free) - 宏观视角

  • 查看磁盘挂载点和使用率:
df -Th
  • 排查问题: 如果 df -h 显示磁盘没满,但无法写入文件,可能是 Inode 满了(小文件太多)。

    • 查看 Inode 使用率:df -i

2. du (Disk Usage) - 微观视角

  • 当前目录下哪个文件夹最大?(找出吃磁盘的元凶):
du -sh * | sort -rh

第四部分: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

第五部分:vmstat & dmesg——系统综合快照

1. vmstat (Virtual Memory Statistics)

虽然名字叫虚拟内存,但它其实是查看 CPU、内存、I/O 的综合报表,适合脚本监控。

  • 每秒刷新一次系统状态:
vmstat 1

2. dmesg (Kernel Ring Buffer)

  • 查看内核日志(硬件故障、OOM Killer): 如果进程突然莫名其妙消失了,很可能是内存溢出被系统杀掉了。
dmesg -T | grep -i "kill"
  1. Level 1 (系统卡顿先看它):

    1. top (看 Load Average, CPU %, wait %)
    2. free -h (看内存剩多少,Swap 用没用)
    3. df -Th (看磁盘是不是满了)
  2. Level 2 (找出谁在捣乱):

    1. du -sh * (磁盘满了,找大文件)
    2. iotop (磁盘慢了,找读写进程)
    3. topM (找吃内存进程)
  3. Level 3 (深层分析):

    1. iostat -xz 1 (分析磁盘具体的饱和度)
    2. dmesg | grep error (看有没有硬件报错)
    3. sar (查看历史性能数据,如果不安装 sysstat 包可能没有)

一个小技巧: 如果你发现系统很慢,但 CPU、内存、磁盘 I/O 看起来都正常,请检查 打开文件数限制ulimit -n

Ulimit -a显示当前所有资源限制 很多时候服务起不来或者报错,是因为达到了最大文件句柄限制(默认通常是 1024,生产环境通常需要调大)。

三、搜索常用命令

第一部分:grep内容搜索

1.基础搜索

最常用的场景:在一个文件或一堆文件里找个关键词。

  1. 黄金组合参数: -rni
  • -r (recursive): 递归查找,不光找当前目录,还找子目录。
  • -n (line number): 显示行号,告诉你关键词在哪一行。
  • -i (ignore case): 忽略大小写(找 "Error" 时也能把 "error" 揪出来)。
  1. 场景化实战
  • 在当前目录及子目录下,查找所有包含 "password" 的文件:
grep -rni "password" .
  • 在单个文件中查找:
grep -i "error" /var/log/syslog

2.上下文控制

这是 grep 最强大的功能之一。当你搜到 "Exception" 时,只看这一行通常没用,你需要看它上面发生了什么,以及下面的堆栈信息。

  1. 记忆口诀:ABC
  • -A (After): 显示匹配行之后的 n 行。
  • -B (Before): 显示匹配行之前的 n 行。
  • -C (Context): 显示匹配行前后各 n 行。
  1. 场景化实战
  • 查看报错后的 10 行堆栈信息(最常用):
grep -A 10 "NullPointerException" catalina.out
  • 查看报错前后各 5 行,分析上下文:
grep -C 5 "Critical Error" application.log

3.精准过滤

有时候搜出来的东西太多,或者太模糊,需要提纯。

  1. 反向过滤: -v (Invert)
  • 场景: 查看配置文件,但是不想看被 # 注释掉的行,也不想看空行。
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
  1. 精确单词匹配: -w (Word)
  • 场景: 你想搜变量 is,但 grep 会把 this, list, history 全给你搜出来。
grep -w "is" code.py
  1. 只要匹配的内容: -o (Only matching)
  • 场景: 只需要提取日志中的 IP 地址,不需要整行内容。
grep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" access.log

4.统计与文件名 —— 宏观视角

  1. 只看文件名: -l (List)
  • 场景: 你不需要看代码具体内容,只想知道哪些文件里调用了 getUserInfo 这个函数。
grep -r -l "getUserInfo" ./src
  1. 统计出现次数: -c (Count)
  • 场景: 今天发生了多少次 404 错误?
grep -c "404 Not Found" access.log

5.高阶正则 —— -E & -F

  1. 扩展正则: -E (Extended)

默认的 grep 支持的基础正则比较弱,使用 | (或)、+ (一个或多个) 等符号时需要转义。加上 -E 就解放了(相当于命令 egrep)。

  • 同时搜两个关键词("Error" 或者 "Warning"):
grep -E "Error|Warning" app.log
  • 搜 8000 到 8999 的端口号:
grep -E "8[0-9]{3}" config.xml
  1. 固定字符串: -F (Fixed)
  • 场景: 你要搜索的内容里包含大量的 . * [ 等特殊字符,你不想让 grep 把它们当正则处理,只想当普通字符搜。
  • 优势: 速度极快。
grep -F "user[0]" script.sh

按照使用频率排序的学习路径:

  1. Level 1 (每天都用):

    1. grep "text" file (基础搜)
    2. grep -rni "text" . (递归搜代码/配置)
    3. ps aux | grep java (查进程,配合管道)
  2. Level 2 (日志分析):

    1. grep -v "info" log (排除干扰信息)
    2. grep -A 10 "error" log (看报错堆栈)
    3. grep -E "error|warn" log (搜多个词)
  3. Level 3 (数据提取):

    1. grep -o (配合正则提取 IP、邮箱)
    2. grep -l (只找文件名,配合 xargs 做批量修改)

一个经典的“骚操作”组合: 找出所有包含 "TODO" 的代码文件,并显示行号,最后只保留最近修改过的文件(需配合 lsfind,这里展示 grep 配合管道):

# 在当前目录递归搜 TODO,显示颜色,显示行号
grep -rni --color=auto "TODO" .

小贴士: 如果你的文件是二进制文件(在这堆乱码里搜字符串),grep 可能会提示 "Binary file matches"。加上 -a 参数可以将二进制文件当作文本文件处理: grep -a "string" binary_file

第二部分:find文件搜索

  1. 基础搜索:名字与类型

  • 按文件名找(最常用):
find /etc -name "nginx.conf"
  • 只找目录或文件:
find . -type d -name "config"
  1. 时间角度:按时间搜索

这是运维排查问题的核心技能。比如:找最近被黑客修改过的文件,或者找一年前的旧日志删除。

  • 参数口诀:

    • -mtime (Modify Time): 内容修改时间。
    • -n: n 天以内(Newer)。
    • +n: n 天以前(Older)。
  • 场景化实战:

    • 找最近 24 小时内被修改过的文件:
    • find /var/www -mtime -1
      
    • 找 7 天以前的旧日志:
    • find /var/log -name "*.log" -mtime +7
      
  1. 空间管理:按大小搜索

  • 找大文件(清理磁盘必备):
find / -type f -size +100M
  1. 骚操作:搜索并执行 (-exec)

找到文件只是第一步,通常我们还要删掉它、移动它或修改它。

  • 找到 7 天前的日志并直接删除(慎用):
find /var/log -name "*.log" -mtime +7 -exec rm -f {} ;
  • 性能优化版(推荐): 配合 xargs 当文件成千上万时,-exec 会启动成千上万个 rm 进程,极慢。用 xargs 可以把文件名打包一次性传给 rm
find . -name "*.log" | xargs rm -f

5.极速闪电 —— locate

如果你觉得 find 太慢(因为它要扫描磁盘),可以用 locate

  • 原理: 它不扫磁盘,而是查一个系统自带的数据库(通常在 /var/lib/mlocate/mlocate.db)。
  • 缺点: 新建的文件可能搜不到,因为数据库通常每天只更新一次。
  1. 常用命令
  • 秒级搜索文件:
locate nginx.conf
  • 我要搜刚创建的文件怎么办? 先手动更新数据库,再搜:
sudo updatedb
locate new_file.txt

第三部分:which / whereis / type —— 命令寻踪

这三个命令专门用来找“命令”本身在哪里。

1. which (我到底在用哪个版本?)

  • 场景: 你装了 python2 和 python3,输入 python 到底运行的是哪一个?
which python
  • 原理: 它只在环境变量 $PATH 里找可执行文件。

2. whereis (全家桶)

  • 场景: 我不光想找二进制文件,还想找它的源代码帮助文档(Man page)在哪里。
whereis nginx

3. type (验明正身)

  • 场景: 为什么 ls 有颜色?为什么 cd 找不到文件?
type ls
type cd

按照使用频率场景记忆:

  1. Level 1 (文件去哪了):

    1. locate filename: 只要大概记得名字,先用这个,最快。
    2. find . -name "filename" : locate 找不到或者是刚建的文件,用这个。
  2. Level 2 (运维清理与排查):

    1. find . -mtime -1: 昨天谁改了文件?(查被黑/查故障)。
    2. find . -size +1G: 磁盘怎么满了?(查大文件)。
    3. find ... | xargs rm: 批量删除旧文件。
  3. Level 3 (环境调试):

    1. which java: 查环境变量配置对不对。
    2. type ll: 查这个命令到底是个啥。

一个核心区别:

  • grep 是在书中(文件内容)里找句子。
  • find 是在图书馆(文件系统)里找书。

四、文本处理与管道操作

我们按照数据流的处理顺序来讲解:提取 -> 排序 -> 统计 -> 执行。


第一部分:awk —— 手术刀

awk 其实是一门编程语言,但作为运维,需要掌握它 10% 的功能(列处理)就足以应对 90% 的场景。

  1. 核心逻辑

awk 默认以“空格”或“Tab”将一行切分成多个字段 (Field)

  • $1: 第一列
  • $2: 第二列
  • $NF: 最后一列 (End of Field)
  • $(NF-1) : 倒数第二列
  1. 常用场景

  • 场景一:提取特定列(最常用) 比如 docker ps,我想取出所有容器 ID。
docker ps | awk '{print $1}'
  • 场景二:指定分隔符 -F /etc/passwd 是用冒号 : 分隔的,默认空格切分不管用。
# 取出所有用户名(第一列)
awk -F: '{print $1}' /etc/passwd
  • 场景三:带条件的提取(支持运算) 只显示 CPU 占用大于 50% 的进程(假设 top 输出在 file.txt,CPU 在第9列)。
awk '$9 > 50 {print $1, $9}' file.txt
  1. 骚操作:自动求和

计算当前目录下所有文件大小的总和(ls -l 的第5列是大小)。

ls -l | awk '{sum += $5} END {print sum}'
  • 逻辑: 对每一行,把第5列加到变量 sum 里;处理完最后一行后 (END),打印 sum。

第二部分:sort —— 整理大师

数据默认是乱序的,不排序就没法统计。

  1. 核心参数

  • -n (Numeric): 按数字大小排序(默认是按字符,10 会排在 2 前面,加了 -n 就正常了)。
  • -r (Reverse): 倒序(大的在上面)。
  • -k (Key): 指定按第几列排序。
  • -h (Human): 能够识别 1K, 2M, 3G 这种格式排序(配合 du -h 使用)。
  1. 场景化实战

  • 场景一:把文件按内容字母顺序排列
sort names.txt
  • 场景二:找出占用磁盘最大的文件
du -h | sort -rh
  • 场景三:按特定列排序 /etc/passwd 按第三列(UID)数字大小排序:
sort -t: -k3 -n /etc/passwd

第三部分:uniq —— 去重统计

uniq 有个致命前提:它只能识别相邻的重复行。所以使用 uniq 之前必须先 sort

  1. 核心参数

  • -c (Count): 在每行前面显示出现的次数(统计神器)。
  • -d (Duplicate): 只显示重复的行。
  • -u (Unique): 只显示出现过一次的行。
  1. 场景化实战:黄金组合 sort | uniq -c | sort -nr

这是 Linux 统计分析的终极连招

  • 场景:统计 access.log 中哪个 IP 访问最多? 假设日志格式第一列是 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5

第四部分:xargs —— 参数传递

很多命令(如 rm, mv, docker)不接受“标准输入”,只接受“参数”。xargs 就是把管道传过来的数据塞到命令的参数位置。

  1. 核心参数

  • -I {} : 定义占位符(最灵活)。把传过来的每一项数据放到 {} 的位置。
  • -n 1: 每次只传 1 个参数给后面的命令。
  1. 场景化实战

  • 场景一:批量删除 找到所有 .tmp 文件并删除:
find . -name "*.tmp" | xargs rm -f
  • 场景二:批量操作 假设你有一个文件 images.txt,里面全是 Docker 镜像名,你想批量 Pull。
cat images.txt | xargs -I {} docker pull {}
  • 场景三:批量移动/重命名 把找到的 .log 文件移动到 /backup 目录:
find . -name "*.log" | xargs -I {} mv {} /backup/
  • 骚操作:多线程并发执行 -P 你需要下载文件列表中 100 个 URL,想 10 个线程并发下载:
cat url_list.txt | xargs -P 10 -I {} curl -O {}

综合实战:分析容器日志

假设你想分析这个容器日志里,到底也是哪个 API 接口在疯狂报错

假设日志格式是:[时间] [级别] [接口路径] 错误信息... 例如:2023-10-01 ERROR /v1/user/login connection timeout

我们可以用一套连招瞬间分析出 Top 5 报错接口:

# 1. 获取日志
docker logs --tail 10000 api 2>&1 | \
# 2. 筛选 ERROR 级别
grep "ERROR" | \
# 3. 提取接口路径 (假设在第3列)
awk '{print $3}' | \
# 4. 排序以便去重
sort | \
# 5. 统计出现次数
uniq -c | \
# 6. 按次数倒序排列
sort -nr | \
# 7. 看前5名
head -5

输出结果可能如下:

8500 /v1/order/create200 /v1/user/info
 50 /health/check

结论: 一眼看出是 /v1/order/create 这个接口炸了,直接去查这个接口的代码,效率 Max。