【问题标题】:How can you modify the first octets in IP address如何修改 IP 地址中的第一个八位位组
【发布时间】:2016-09-11 03:41:21
【问题描述】:

谁能指导我如何使用 shell 脚本修改 IP 地址中的前两个八位字节?

我尝试修改此代码,但没有成功。任何指导或帮助将不胜感激。

这个例子将替换最后一个八位字节:

cat test.sh
ip=$1
baseip=`echo $ip | cut -d"." -f1-3`
echo $baseip".0"
./test.sh 192.168.133.14
192.168.133.0

【问题讨论】:

    标签: bash ip shell


    【解决方案1】:
    ip=$1
    tailip=`echo $ip | cut -d"." -f3-4`
    echo "x.x."$tailip
    

    【讨论】:

      【解决方案2】:
      ip="10.1.2.3"
      echo $ip | awk -F '.' '{printf("192.168.%d.%d", $3, $4)}'
      
      Output: 192.168.2.3
      

      【讨论】:

      • 回声 192.168.133.14 | sed 's/[0-9][0-9][0-9].[0-9][0-9][0-9]./*.*./' ..133.14
      • @user152523 受虐狂。如果前两个八位字节不是 3 位数字,也不起作用。
      • @user152523 echo 192.168.133.14 | sed 's/\([0-9]*\)\.\([0-9]*\)\.[0-9]*\.[0-9]*/\1.\2.133.14/' 有效,但它仍然比 awk 或 cut 更让人头疼。
      【解决方案3】:

      使用 bash 的 PE 能力的好方法:

      ip="10.1.2.3"; tmpip="${ip#*.*.}";  echo "192.168.$tmpip"
      

      还有一件值得注意的事情是,您可以随机生成要生成的 IP。只是提供一些一般性的想法。

      ip="10.1.2.3"; tmpip="${ip#*.*.}";  echo "$[RANDOM%256].$[RANDOM%256].$tmpip"
      

      【讨论】:

      • 是的,你当然可以。这就是 bash PE(参数扩展)功能的强大之处。
      【解决方案4】:
      bytes12=10.0
      ip=$(echo $1 | sed "s/\([0-9]\+\.\)\{2\}\(.*$\)/$bytes12.\2/")
      

      sed: s/a/b/ 找到 a 并将其替换为 b。 \(\) 封装子表达式,由\1, \2, ... 寻址。

      第一个子表达式匹配 192.168. 之类的序列,即两次 (\{2\}) 至少一个数字 (\+) 后跟一个点。第二个子表达式匹配介于它和行尾 ($) 之间的任何内容。

      由于我们对\1 不感兴趣,因此无需提及。我们用我们固定的高阶字节表示 $bytes12 替换它。最后一个 to 字节预计包含在 \2 中,所以我们只是附加它。

      【讨论】:

        【解决方案5】:
        INET_NTOA () { 
            local IFS=. num quad ip e
            num=$1
            for e in 3 2 1
            do
                (( quad = 256 ** e))
                (( ip[3-e] = num / quad ))
                (( num = num % quad ))
            done
            ip[3]=$num
            echo "${ip[*]}"
        }
        
        INET_ATON () {
            local IFS=. ip num e
            ip=($1)
            for e in 3 2 1
            do
                (( num += ip[3-e] * 256 ** e ))
            done
            (( num += ip[3] ))
            echo "$num"
        }
        

        在这里找到:How to efficiently convert long int to dotted quad IP in bash

        【讨论】:

          【解决方案6】:

          我使用这种类型的功能来自动启用或禁用防火墙规则,特别是我只希望在本地网络上使用的服务,而不能从其他任何地方访问。

          我从我使用的服务器安装脚本的各个部分拼凑起来。它将提取网络接口名称,提取网络和掩码信息,然后对其进行解析,为您提供正确的掩码子网和 CIDR 表示法。实际上,我只是在今天使用此页面作为指南添加了最后一部分,但它会为您完全自动化该过程:

          #!/bin/bash
          
          subnetip=""
          subnetmask=""
          nicname=""
          
          runme()
          {
              # pull name for primary network interface with internet access
              nicname=$(ip route get 8.8.8.8 | awk '{print $5}')
          
              # pull interface IP Address/subnet info assigned by DHCP
              local subnetmasktemp=$(ip -o -f inet addr show $nicname | awk '{print $4}')
          
              # split ip/subnet into two variables, subnetip and subnetmask
              local IFS=/
              set $subnetmasktemp
              subnetip=$1
              subnetmask=$2
          
              # parse ipaddress and subnet info and output appropriate info for client subnet
              local baseip=0
              if [ "$subnetmask" -le 31 ] && [ "$subnetmask" -ge 24 ]; then
                  baseip=`echo $subnetip | cut -d"." -f1-3`
                  subnetip=($baseip".0")
              elif [ "$subnetmask" -le 23 ] && [ "$subnetmask" -ge 16 ]; then
                  baseip=`echo $subnetip | cut -d"." -f1-2`
                  subnetip=($baseip".0.0")
              elif [ "$subnetmask" -le 15 ] && [ "$subnetmask" -ge 8 ]; then
                  baseip=`echo $subnetip | cut -d"." -f1`
                  subnetip=($baseip".0.0.0")
              fi
          
              echo "$subnetip/$subnetmask"
          }
          
          
          runme;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-13
            • 2020-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-02
            • 2018-09-19
            • 2016-01-18
            相关资源
            最近更新 更多