Bash 用于检查和插入IP地址的Shell脚本
我有一个文本文件,其中包含一长串已排序的IP地址。该文件的示例如下所示:Bash 用于检查和插入IP地址的Shell脚本,bash,shell,Bash,Shell,我有一个文本文件,其中包含一长串已排序的IP地址。该文件的示例如下所示: 103.21.244.0/22 1; #Cloudflare 103.22.200.0/22 1; #Cloudflare 103.31.4.0/22 1; #Cloudflare 104.16.0.0/12 1; #Cloudflare 108.162.192.0/18 1; #Cloudflare 141.101.64.0/18 1; #Cloudfla
103.21.244.0/22 1; #Cloudflare
103.22.200.0/22 1; #Cloudflare
103.31.4.0/22 1; #Cloudflare
104.16.0.0/12 1; #Cloudflare
108.162.192.0/18 1; #Cloudflare
141.101.64.0/18 1; #Cloudflare
162.158.0.0/15 1; #Cloudflare
173.245.48.0/20 1; #Cloudflare
188.114.96.0/20 1; #Cloudflare
190.93.240.0/20 1; #Cloudflare
197.234.240.0/22 1; #Cloudflare
198.41.128.0/17 1; #Cloudflare
199.27.128.0/21 1; #Cloudflare
我正在尝试编写一个shell脚本,该脚本执行以下操作:
1.2.3.4
)或IP范围(例如1.2.3.0/24
),请确定该地址是否已在文件中188.114.98.200
,grep将返回负数,事实上它已经由188.114.96.0/20
表示。同样适用于188.114.98.0/24
B.我也不知道如何在正确的位置插入IP地址/范围条目,而不扰乱排序顺序
有人能帮忙吗?多谢各位
编辑:
好的,在看了这些建议之后,我想我不必不必要地限制自己使用Bash,特别是如果已经有其他语言的库可以轻松完成这项工作。在我看来,比较/匹配IP格式字符串将非常烦人 这(清单4)有一个很好的简单技巧,可以仅使用bash参数替换将IP字符串转换为整数数组(有文档记录,请查找
${var#Pattern},${var#Pattern}
)
如果要捕获掩码,请添加类似于IP[5]=${tmp##*/}
(带有linux mag pdf的符号)
对于简单的IP比较,您可以简单地将整数数组与bash的算术求值(…)
(例如有文档记录)进行比较/匹配
对于更复杂的CIDR匹配,要么您愿意自己实现相当多的逻辑,要么尝试在大多数Linux发行版上可用的工具,如
ipcalc
(check)。不是bash
,但是使用Python
这个任务非常简单:
>>> print ips
103.21.244.0/22 1; #Cloudflare
103.22.200.0/22 1; #Cloudflare
103.31.4.0/22 1; #Cloudflare
104.16.0.0/12 1; #Cloudflare
108.162.192.0/18 1; #Cloudflare
141.101.64.0/18 1; #Cloudflare
162.158.0.0/15 1; #Cloudflare
173.245.48.0/20 1; #Cloudflare
188.114.96.0/20 1; #Cloudflare
190.93.240.0/20 1; #Cloudflare
197.234.240.0/22 1; #Cloudflare
198.41.128.0/17 1; #Cloudflare
199.27.128.0/21 1; #Cloudflare
>>> import iptools
>>> [raw_range for raw_range in ips.splitlines()
... if '188.114.98.200' in iptools.IpRangeList(raw_range.split()[0])]
['188.114.96.0/20 1; #Cloudflare']
>>>
>>> [raw_range for raw_range in ips.splitlines()
... if '188.112.98.200' in iptools.IpRangeList(raw_range.split()[0])]
[]
至于插入到正确的位置,我只会附加到末尾,然后使用文件。不太确定是否将
.98.200
与.96.0/20
匹配。祝你好运。请解释一下你用来确定188.114.98.200
如何等于188.114.96.0/20
或188.114.98.0/24
@AbhishekPathak的逻辑,大概是通过某种网络掩码逻辑:CIDR符号确实存在一个小挑战。如果文本文件中的所有CIDR
范围>=17
,则可以grep
用于IP的前3个组件。如果找到匹配项,则需要根据IP范围测试完整IP。如果=8
,则检查前两个组件,依此类推。@AbhishekPathak我只需使用ipcalc
检查结果。谢谢。我不熟悉Python,但如果它完成了任务,我会接受它。毕竟,Python已经安装,在Bash中创建比较/匹配IP地址的逻辑似乎很麻烦。谢谢你给我指点图书馆的iptools。我得去了解更多,谢谢。但是,如果已经有一个库来进行IP地址的比较和匹配,我可能会同意@klashxx的建议,即使它不是Bash。