网络

掩码考点

  1. 同一局域网下的192.168.50.128/25和192.168.50.127/25能否ping通(无路由器无交换机的情况)
  2. 那同一局域网下的192.168.50.127/25和192.168.50.126/25能否ping通

子网掩码(Subnet Mask)是计算机网络中非常核心的概念。简单来说,它的作用就是在 IP 地址中“划线”,区分哪一部分代表“街道”(网络号),哪一部分代表“门牌号”(主机号)。
以下是关于子网掩码的核心知识点:

  1. 核心作用:身份识别
    一个 IP 地址(如 192.168.1.5)本身无法告诉电脑它属于哪个网络。子网掩码的作用就是:
  • 确定网络地址: 告诉设备哪些位是网络标识。
  • 确定主机地址: 告诉设备哪些位是个体设备标识。
  • 判断是否在同一网段: 电脑通过子网掩码计算出目标 IP 是否和自己在同一个“群聊”里。如果是,直接发消息;如果不是,就发给路由器(网关)。

2. 形态与结构

子网掩码和 IP 地址一样,也是 32 位二进制数,通常用“点分十进制”表示。它的规则非常简单粗暴:

  • 连续的 1: 对应的 IP 位是网络号
  • 连续的 0: 对应的 IP 位是主机号

常见对应关系:

掩码(十进制) 掩码(二进制) 含义
255.0.0.0 11111111.0... 前 8 位是网络,后 24 位是主机
255.255.255.0 11111111.11111111.11111111.00000000 前 24 位是网络,后 8 位是主机

3. 为什么会有 /24 这种写法?(CIDR)

你可能经常看到 192.168.1.1/24。这叫 CIDR(无类别域间路由) 记法。

  • /24 就代表子网掩码的前 24 位全是 1
  • 也就是 255.255.255.0
  • 如果是 /16,就是 255.255.0.0

4. 子网掩码是如何工作的?(AND 运算)

计算机通过二进制的 “与”(AND)运算 来计算网络地址。

  • 规则: 1 & 1 = 1; 1 & 0 = 0; 0 & 0 = 0。

例子:
IP 地址:192.168.1.10
掩码:255.255.255.0
两者进行 AND 运算后,结果为 192.168.1.0。这就是该设备所在的网络地址

5. 如何计算子网下的主机数量?

在一个子网中,有多少个 IP 可以分配给电脑使用?

可用主机数=2n2可用主机数 = 2^n - 2

  • 是子网掩码中 0 的个数
  • 为什么要减 2?
  1. 主机号全为 0 的地址是网络地址(代表整个网段)。
  2. 主机号全为 1 的地址是广播地址(发给该网段所有人的消息)。

linux运维

考考你假设你现在面对一个被黑的 WordPress 站点,/var/www 下有 8 万个 PHP 文件,需要快速找出含 eval( 的可疑文件。

你更倾向哪种做法? 单选

find … | xargs grep

find … -exec grep {} ;

find … -exec grep {} +

find -print0 | xargs -0 -P 4 grep

  1. find ... -exec grep {} \;

命令含义:找到一个文件,就暂停 find,启动一个 grep 进程查这个文件,查完关掉,再找下一个。

  • 机制1 对 1。每找到 1 个文件,执行 1 次 grep 命令。
  • 致命伤进程开销极大
    • 对于 8 万个文件,系统需要执行 80,000 次 fork()(创建进程)和 exec()(执行命令)。
    • 这就像你要送 8 万封信,这个做法是:拿一封信,开一次车去邮局,回来;再拿一封信,再开一次车去邮局。
    • 结果:慢到让你怀疑人生,可能需要跑十几分钟。
  1. find ... | xargs grep

命令含义find 把找到的文件名一股脑丢给管道,xargs 负责把这些文件名拼成一行,一次性传给 grep

  • 机制多 对 1。默认情况下 xargs 会尽可能多地填满命令行长度,比如一次传 1000 个文件给 grep
  • 优点:快!只启动几十次 grep 进程。
  • 致命伤安全漏洞(Separator 问题)
    • 默认的 xargs空格换行作为分隔符。
    • 如果有一个文件名叫 my photo.php(中间有空格)。
    • find 输出了 my photo.php
    • xargs 会以为这是两个文件:myphoto.php
    • grep 就会报错说找不到文件 my,从而漏掉了对这个文件的检查。黑客常利用这一点隐藏后门。
  1. find ... -exec grep {} +

命令含义:这是 POSIX 标准推荐的高效写法。find 会自己把文件名攒起来,攒够了一波,再调用一次 grep

  • 机制多 对 1(内置优化)。逻辑和 xargs 类似,但由 find 内部处理。
  • 优点
    • 安全:它能正确处理包含空格等怪异字符的文件名。
    • 较快:减少了进程启动次数。
  • 缺点它是单线程的。它只能利用一个 CPU 核心挨个处理这 8 万个文件。如果你的服务器是 8 核甚至 16 核的,另外 7 个核都在围观,极其浪费。
  1. find -print0 | xargs -0 -P 4 grep

命令含义:安全处理文件名,并且开启 4 个线程并行处理。

  • find -print0

    • 告诉 find:在输出每一个文件名后,不要加换行符,而是加一个 NULL 字符(ASCII 0)
    • 为什么? 因为在 Linux 文件系统中,文件名可以包含几乎任何字符(空格、换行、逗号等),唯独不能包含 NULL 字符。这是唯一绝对安全的分隔符。
  • xargs -0

    • 告诉 xargs:不管你读到什么(空格、引号、反斜杠),都只当做普通字符,直到读到一个 NULL 字符 才认为是一个文件名的结束。
    • 这与前面的 -print0绝配,完美解决了“白银段位”中的安全问题。
  • -P 4 (关键性能点)

    • Parallel(并行)
    • 告诉 xargs:不要等上一个 grep 跑完了再跑下一个。请同时启动 4 个 grep 进程并行工作!
    • 如果你的服务器是 4 核 CPU,理论速度可以提升接近 4 倍。对于 IO 密集型或 CPU 密集型任务(grep 大文件是 CPU 密集型),这是质的飞跃。

根据题意(快速、安全、并发、针对 PHP 文件),完整的最佳实践命令如下:

find /var/www -type f -name "*.php" -print0 | xargs -0 -P 4 grep -l "eval("
  1. find /var/www
    • 指定查找的根目录。
  2. -type f
    • 只查找“文件”,排除目录(提高效率,避免 grep 报错说“Is a directory”)。
  3. -name "*.php"
    • 关键过滤:题目明确说是“8 万个 PHP 文件”,加上这个参数能避免去 grep 图片、日志或静态资源,大幅减少无用功。
  4. -print0
    • 安全核心:输出文件名时以 null 字符结尾。这是为了应对“被黑”场景下可能存在的恶意文件名(如包含空格、换行符的文件),防止命令执行出错或被绕过。
  5. |
    • 管道符,传递数据。
  6. xargs -0
    • 安全核心:告诉 xargs 以 null 字符作为分隔符来读取文件名,与前面的 -print0 完美配合。
  7. -P 4
    • 速度核心:启用 4 个进程并行执行 grep。如果是 8 核服务器,可以改为 -P 8,速度直接起飞。
  8. grep -l "eval("
    • "eval(": 查找包含 eval( 的字符串。
    • -l (小写 L):只输出包含匹配内容的文件名
      • 如果不加 -l,grep 会把匹配到的那一行代码打印出来。
      • 题目要求是“找出…文件”,通常我们需要的是一份文件清单(list),方便后续进行隔离或删除,所以 -l 最合适。
find /var/www -type f -name "*.php" -print0 | xargs -0 -P 4 grep -Hn --color "eval("
  • -H: 强制显示文件名。
  • -n: 显示行号。
  • --color: 高亮匹配到的 eval(,方便肉眼识别。