如何修改IP地址中的第一个八位字节

时间:2013-01-08 20:44:29

标签: bash ip shell

有人可以指导我如何使用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

6 个答案:

答案 0 :(得分:6)

ip=$1
tailip=`echo $ip | cut -d"." -f3-4`
echo "x.x."$tailip

答案 1 :(得分:3)

ip="10.1.2.3"
echo $ip | awk -F '.' '{printf("192.168.%d.%d", $3, $4)}'

Output: 192.168.2.3

答案 2 :(得分:1)

使用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"

答案 3 :(得分:0)

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替换它。 <{1}}将包含最后一个字节,因此我们只需将其附加。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

我从我使用的服务器安装脚本的各个部分拼凑了这个。它将拉出网络接口名称,拉取网络和掩码信息,然后解析它以提供正确的掩码子网和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;