從任何命令輸出中屏蔽公共 IP 地址(用於診斷)
我正在編寫一個腳本來從 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
謝謝!!
像這樣的
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