IP地址转换器

Kar*_*lsD 11 ip bash converter

有IP地址:66.102.13.19,并且从该地址收到此地址

http://1113984275
Run Code Online (Sandbox Code Playgroud)

但是怎么样?我怎么能在bash的帮助下做到这一点.例如,这项服务可以做到,但我不懂算法.

Pau*_*ce. 34

ip=66.102.13.19
IFS=. read -r a b c d <<< "$ip"
printf '%s%d\n' "http://" "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))"
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你问题中的数字与IP地址不匹配.

要将小数转换为IP:

#!/bin/bash
dec2ip () {
    local ip dec=$@
    for e in {3..0}
    do
        ((octet = dec / (256 ** e) ))
        ((dec -= octet * 256 ** e))
        ip+=$delim$octet
        delim=.
    done
    printf '%s\n' "$ip"
}

dec2ip "$@"
Run Code Online (Sandbox Code Playgroud)

要将IP转换为小数:

#!/bin/bash
ip2dec () {
    local a b c d ip=$@
    IFS=. read -r a b c d <<< "$ip"
    printf '%d\n' "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))"
}

ip2dec "$@"
Run Code Online (Sandbox Code Playgroud)

演示:

$ ./dec2ip 1113984275
66.102.13.19

$ ./ip2dec 66.102.13.19
1113984275
Run Code Online (Sandbox Code Playgroud)

这两个脚本依赖于某些Bourne派生shell中不存在的Bash功能.以下是要使用的AWK版本:

#!/usr/bin/awk -f
# dec2ip
BEGIN {
    dec = ARGV[1]
    for (e = 3; e >= 0; e--) {
        octet = int(dec / (256 ^ e))
        dec -= octet * 256 ^ e
        ip = ip delim octet
        delim = "."
    }
    printf("%s\n", ip)
}
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/awk -f
# ip2dec
BEGIN {
    ip = ARGV[1]
    split(ip, octets, ".")
    for (i = 1; i <= 4; i++) {
        dec += octets[i] * 256 ** (4 - i)
    }
    printf("%i\n", dec)
}
Run Code Online (Sandbox Code Playgroud)

可以使用与上面的Bash脚本相同的方式调用它们.


Hon*_*Liu 10

IP地址 - >号码:

echo 66.102.13.19 | tr . '\n' | awk '{s = s*256 + $1} END{print s}'
Run Code Online (Sandbox Code Playgroud)

号码 - > IP地址:

(export ip=1113984275; for i in {1..4}; do s='.'$((ip%256))$s && ((ip>>=8)); done; echo ${s:1})
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过指定记录分隔符来避免调用 `tr`,即: `awk 'BEGIN{RS="."}...` 或 `awk '{s = s*256 + $1} END{print s }'RS=。` (2认同)