Bash 用于检查和插入IP地址的Shell脚本

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

我有一个文本文件,其中包含一长串已排序的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;  #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脚本,该脚本执行以下操作:

  • 对于给定的IP地址(例如
    1.2.3.4
    )或IP范围(例如
    1.2.3.0/24
    ),请确定该地址是否已在文件中

  • 如果是,什么也不做。如果不是,则将其插入文件的正确位置

  • 问题:

    答:我一直在检查文件中是否已经有IP地址或IP范围,因为一个简单的grep是不行的。例如,对于IP
    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。