【问题标题】:CentOS, Convert ipV6 short to long formCentOS,将 ipV6 短格式转换为长格式
【发布时间】:2016-04-19 04:44:24
【问题描述】:

我刚开始使用 bash 脚本,还有一个小问题需要解决:

我得到一个这种格式的 IPv6 地址: 1080::8:800:200C:417A

现在我想将短的转换成长的 IPv6 形式,例如:1080:0:0:0:8:800:200C:417A

是否有正则表达式或类似的东西来转换它?

我正在开发一个在 CentOS 上运行的 docker 容器。

【问题讨论】:

  • CentOS 8 还没出...
  • 我怀疑写一个表达式来进行翻译可能是不可行的。您必须确定缺少多少组,这不是一个简单的练习,然后使用有关缺少多少组的信息编写替换。在 Perl 之类的东西中,您可以在替换中执行任意 (Perl) 代码,这可能更接近可行。

标签: bash centos ipv6


【解决方案1】:

它不是一个正则表达式,但它是“类似的东西”,它可以完成工作:(用 python3.5.1 测试)

>>> import ipaddress
>>> x = '1080::8:800:200C:417A'
>>> y = ipaddress.ip_address(x)
>>> y.exploded
'1080:0000:0000:0000:0008:0800:200c:417a'
>>> 

参考: https://docs.python.org/3/library/ipaddress.html

【讨论】:

    【解决方案2】:
    #!/bin/bash
    echo "enter the ip address:"
    read s
    if [[ $s =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then
    
            echo -e '\E[47;31m'"\033[1mIPv6 Format\033[0m" 
            echo -n "The IPv6 Address Expanded Form:"
            EXPANDED=`sipcalc $s | fgrep Expand | cut -d '-' -f 2`
            echo -e "\033[32m $EXPANDED\033[0m"
            echo -n "IPv6 address Compress Form:"
            Compress=`sipcalc $s | fgrep Comp | cut -d '-' -f 2`
            echo  -e "\033[32m$Compress\033[0m"
            echo -n "Address Type of IPv6:"
            type=`sipcalc $s | fgrep type | cut -d '-'  -f 2,3,4`
            comment=`sipcalc $s | fgrep Comment | cut -d '-' -f 2`
            echo -e "\033[32m $type$comment\033[0m"
    else
            echo  -e '\E[37;44m'"\033[1mNOT VALID IPv6 address\033[0m"
    fi
    

    这是我的 ipv6 验证代码。U 将使用“sipcalc”获得扩展形式的 ip。但你应该执行一些 grep 和 cut 命令

    【讨论】:

    • 哎哟!正如所写的那样,它很好地说明了为什么单独的正则表达式并不是一种特别好的映射方式。在大型正则表达式的最右端有一些有趣的(重要的)特殊情况。对出现的字面 ffff 提出质疑是可行的(它不应该也允许 FFFF 吗?)。您没有锚定正则表达式,因此它匹配字符串中的任何位置。并且您使用其他东西(sipcalc 程序)来规范化数据,而不是使用正则表达式进行替换操作。不过,在显示匹配的正则表达式方面做得很好。
    • 有很多用于 ipv6 验证的测试用例。为了满足这些测试用例,我们需要一些其他方法..
    • 我将 reg ex 锚定在 if 语句的开头。我们可以将 ffff 更改为 [fF]{4}。所以我们可以解决这个问题..这个 reg-exp 还有很多其他问题
    【解决方案3】:

    这是我解压 IPv6 地址的方法。

    #!/bin/bash
    
    decompress_ipv6_address() {
        # How many hextets are there
        num_hextets=${addr//[^:]/}
        num_hextets=${#num_hextets}
    
        # Fix up beginning and end
        [[ $addr =~ ^:: ]] && addr='0'$addr
        [[ $addr =~ ::$ ]] && addr=$addr'0'
    
        # Create additional hextets
        additional_hextets=':'
        for (( i=$num_hextets; $i<8; i++ ))
        do
            additional_hextets=$additional_hextets'0:'
        done
    
        # Insert additional hextets (replace ::)
        addr=${addr/::/$additional_hextets}
    }
    

    【讨论】:

    • 这不适用于混合 IPv6 地址。此外,“hextet”将用于 6 位,因为 octet 用于 8 位或 quartet 用于 4 位。您正在处理 16 位字(十六进制)。
    • 你会注意到函数名是“decompress_ipv6_address”。不是“decompress_ipv6_mixed_address”。 “计算中的 Hextet 是 16 位聚合,或 4 个半字节。”一个半字节是 4 位。 “十六进制是 IPv6 地址中 8 个块中每个块的非官方名称。” - en.wikipedia.org/wiki/Hextet
    • 混合的 IPv6 地址仍然是有效的 IPv6 地址,它们也可以被压缩。一个好的解压缩也会考虑压缩和混合的 IPv6 地址。 16 位字是一个十六进制。一个十六进制是六位。例如,TCP 标志是 TCP 标头中的一个十六进制(六位)。 Hex是6,oct是8,quad是4,但是hexadec是16。正确的说,在网络世界里,我们简单地称它们为word,一个IPv6地址就是8word
    • 你可以把你的一生都花在琐碎的小争论上,就像它是一个十六进制......但在计算中它仍然被称为一个十六进制。
    • 该问题专门将非混合压缩格式引用为仅未压缩。碰巧这也是我需要的,所以已经提供了。如果此人或其他任何人需要混合,则添加该内容只是很小的更改。没有人声称 ipv4 映射的 ipv6 无效。但这并不意味着我们都需要在特定的用例和环境中处理它。
    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多