AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1006999
Accepted
user3018558
user3018558
Asked: 2020-03-16 01:14:43 +0800 CST2020-03-16 01:14:43 +0800 CST 2020-03-16 01:14:43 +0800 CST

从任何命令输出中屏蔽公共 IP 地址(用于诊断)

  • 772

我正在编写一个脚本来从 BusyBox v1.25.1/Linux 2.6.36/router 中提取信息,用户可以在其中简单地运行脚本并将输出复制/粘贴到提交表单中以请求支持。该脚本本质上是一个命令列表,如route、ifconfig等。由于busybox 的含义,我仅限于/bin/sh。

我正在尝试找到一种智能方法来仅从输出中自动屏蔽所有公共 IP 地址。替换完整的 IP 已经很好了,但是如果可能的话,我会在每个命令(甚至是内部函数)的末尾寻找一个管道命令来简单地替换前两个八位字节 80.80.80.80 , 例如XX.XX.80.80

一个不错的功能是替换相同数量的数字以尽可能保留格式。例如

8.8.8.8=X.X.X.X 80.80.8.8=XX.XX.X.X 180.180.80.8=XXX.XXX.XX.X

实际例子:

root@router:/proc# route | filtering-goes-here Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface XX.XX.168.1 * 255.255.255.255 UH 0 0 0 vlan2 172.16.9.0 * 255.255.255.0 U 0 0 0 br1 10.10.9.0 * 255.255.255.0 U 0 0 0 br0 10.114.126.0 * 255.255.254.0 U 0 0 0 tun11 XX.XX.168.0 * 255.255.252.0 U 0 0 0 vlan2 10.10.0.0 * 255.255.0.0 U 0 0 0 tinc 127.0.0.0 * 255.0.0.0 U 0 0 0 lo default cpc86269 0.0.0.0 UG 0 0 0 vlan2

谢谢!!

replace busybox sed mask sh
  • 1 1 个回答
  • 288 Views

1 个回答

  • Voted
  1. Best Answer
    nik
    2020-03-16T02:08:16+08:002020-03-16T02:08:16+08:00

    像这样的sed脚本对您有用吗?

    $ cat filter.sed
    s|\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\)|___\1___\2___\3___\4|g
    s|___[0-9]|___X|g
    s|___X[0-9]|___XX|g
    s|___XX[0-9]|___XXX|g
    s|___||g
    

    这是一个示例运行,

    $ echo "111.22.3.44" | sed -f filter.sed
    XXX.XX.X.XX
    

    这会将表单的所有 IP 地址转换a.b.c.d为等效宽度x.x.x.x模式。如果您需要跳过某些 IP 地址,则这些 IP 地址需要脚本中的排除规则。

    如果该___模式是此处使用的上下文中可能输出的一部分,则需要更改为脚本输入中不可能的不同“上下文”。

    更新:对于公共 IP 掩码
    尝试使用此sed脚本替换上述基本脚本。

    s|\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)|__#\1.\2.\3.\4|g
    s|#0\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|0\1|g
    s|#10\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|10\1|g
    s|#127\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|127\1|g
    s|#255\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|255\1|g
    s|#\(22[4-9]\)\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|\1\2|g
    s|#\(23[0-8]\)\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|\1\2|g
    s|#169\.254\(\.[0-9]\+\.[0-9]\+\)|169.254\1|g
    s|#192\.168\(\.[0-9]\+\.[0-9]\+\)|192.168\1|g
    s|#\(172\.1[6789]\)\(\.[0-9]\+\.[0-9]\+\)|\1\2|g
    s|#\(172\.2[0-9]\)\(\.[0-9]\+\.[0-9]\+\)|\1\2|g
    s|#\(172\.3[01]\)\(\.[0-9]\+\.[0-9]\+\)|\1\2|g
    s|__#\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\)|___\1___\2___\3___\4|g
    s|___[0-9]|___X|g
    s|___X[0-9]|___XX|g
    s|___XX[0-9]|___XXX|g
    s|___||g
    s|__||g
    

    注意:这也将x排除网络掩码,但有一个例外。我没有添加240.0.0.0到列表中。

    更新 2:如果您只想屏蔽每行上的第一个 IP 地址
    这是针对route第一列是 IP 地址的输出情况。将更新脚本
    中的第一行替换为,sed

    s|^\(\s*\)\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)|\1__#\2.\3.\4.\5|g
    

    根据 OPs 的建议,在这里也留下 mask-for-private-IPs 脚本

    # Modified version that limits to first IP on each line prefixed with whitespace.
    s|^\(\s*\)\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)|\1___#\2.\3.\4.\5|g
    # Basic version that operates on all IP strings in the input.
    #s|\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)|___#\1.\2.\3.\4|g
    #
    s|\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)|___#\1.\2.\3.\4|g
    s|___#0\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___0\1|g
    s|___#10\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___10\1|g
    s|___#127\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___127\1|g
    s|___#255\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___255\1|g
    s|___#224\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___224\1|g
    s|___#\(22[4-9]\)\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___\1\2|g
    s|___#\(23[0-8]\)\(\.[0-9]\+\.[0-9]\+\.[0-9]\+\)|___\1\2|g
    s|___#169\.254\(\.[0-9]\+\.[0-9]\+\)|___169.254\1|g
    s|___#192\.168\(\.[0-9]\+\.[0-9]\+\)|___192.168\1|g
    s|___#\(172\.1[6789]\)\(\.[0-9]\+\.[0-9]\+\)|___\1\2|g
    s|___#\(172\.2[0-9]\)\(\.[0-9]\+\.[0-9]\+\)|___\1\2|g
    s|___#\(172\.3[01]\)\(\.[0-9]\+\.[0-9]\+\)|___\1\2|g
    s|___\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\.\)\([0-9]\+\)|___\1___\2___\3___\4|g
    s|___[0-9]|___X|g
    s|___X[0-9]|___XX|g
    s|___XX[0-9]|___XXX|g
    s|___#||g
    s|___||g
    
    • 1

相关问题

  • 如何使用 Ansible 有条件地在文件中追加一行?

  • 搜索 index.php 和 index.html 并替换字符串

  • 更换2000域控制器

  • 什么是好的批量查找/替换 Windows 工具?[关闭]

  • 贵公司多久更换一次所有服务器?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve