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

一、网络常用命令

1.ss(Socket Statistics)

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

常用组合

最常用的参数是:-tulnp

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

场景化实战

  • 查看本机开启了哪些 端口 (服务):

    ss -tulnp

  • 查看所有已建立的连接(不含监听):

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

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

    • 查找所有连接到远程 8080 端口的连接:
    复制代码
      ss -nt dst :8080
    • 查找状态为"已建立"的连接:
    perl 复制代码
    ss -t state established
    • 查找状态为 TIME-WAIT 的连接(排查高并发连接释放问题):
    perl 复制代码
    ss -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)打开了哪些网络连接?

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

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

3.ip & tcpdump

1. ip 命令 (iproute2 套件)

用来取代 ifconfigroute

  • 查看 IP 地址:

    css 复制代码
    ip 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。

  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 (精细化连接分析)

二、资源管理常用命令

1.top & htop

经典老将:top

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

  • 常用启动:

    css 复制代码
    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 的时间(重点!如果这个高,说明磁盘是瓶颈)。

视觉系新秀:htop

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

2. free------内存管理

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

常用命令

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

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

3.df & du------ 磁盘空间与文件

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

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

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

    • 查看 Inode 使用率:df -i

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"
  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,生产环境通常需要调大)。

三、搜索常用命令

1.grep内容搜索

1.基础搜索

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

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

2.上下文控制

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

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

3.精准过滤

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

  1. 反向过滤: -v (Invert)
  • 场景: 查看配置文件,但是不想看被 # 注释掉的行,也不想看空行。
bash 复制代码
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
  1. 精确单词匹配: -w (Word)
  • 场景: 你想搜变量 is,但 grep 会把 this, list, history 全给你搜出来。
perl 复制代码
grep -w "is" code.py
  1. 只要匹配的内容: -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.统计与文件名 ------ 宏观视角

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

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

  1. 扩展正则: -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
  1. 固定字符串: -F (Fixed)
  • 场景: 你要搜索的内容里包含大量的 . * [ 等特殊字符,你不想让 grep 把它们当正则处理,只想当普通字符搜。
  • 优势: 速度极快。
perl 复制代码
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 配合管道):

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 小时内被修改过的文件:
    arduino 复制代码
    find /var/www -mtime -1
    • 找 7 天以前的旧日志:
    lua 复制代码
    find /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)。
  • 缺点: 新建的文件可能搜不到,因为数据库通常每天只更新一次。
  1. 常用命令
  • 秒级搜索文件:

    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

按照使用频率场景记忆:

  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 是在图书馆(文件系统)里找书**。**
相关推荐
四谎真好看1 小时前
Linux 附录二,实验一
linux·运维·服务器·学习笔记
i***51261 小时前
Failed to restart nginx.service Unit nginx.service not found
运维·nginx
neo_will_mvp2 小时前
IDC服务器故障排除思路
运维·服务器
8***84822 小时前
Nginx代理到https地址忽略证书验证配置
运维·nginx·https
傲世(C/C++,Linux)2 小时前
Linux系统编程——TCP客户端
linux·运维·tcp/ip
SelectDB2 小时前
Apache Doris 在小米统一 OLAP 和湖仓一体的实践
运维·数据库·程序员
23124_802 小时前
网络管理-1
运维·服务器·前端
YongCheng_Liang2 小时前
Python实现PDF 转 JPG 批量转换工具
运维·python·pdf