Sed

從任何命令輸出中屏蔽公共 IP 地址(用於診斷)

  • March 15, 2020

我正在編寫一個腳本來從 BusyBox v1.25.1/Linux 2.6.36/router 中提取資訊,使用者可以在其中簡單地​​執行腳本並將輸出複制/粘貼到送出表單中以請求支持。該腳本本質上是一個命令列表,如routeifconfig等。由於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

謝謝!!

像這樣的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

引用自:https://serverfault.com/questions/1006999