2010-07-11 8 views

Respuesta

9

Ver la función INET_NTOA, puede usar eso para convertir el número a una IP en el servidor MySQL.

+0

Gracias! No me di cuenta de que puedes pasar el campo mysql a INET_NTOA. – Mark

1

Suponga que tiene un campo llamado ip_addr en una tabla llamada hosts

Entonces

select INET_NTOA(ip_addr) from hosts; 

harían la consulta y devolver IPs de cuaterna en el conjunto de resultados.

15

Has solicitado que Bash:

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" 
} 

Ejemplos:

$ INET_ATON 10.2.1.255 
167903743 
$ INET_NTOA 167903743 
10.2.1.255 

que aquí hay una versión que funcione en cualquiera de las conchas derivados de Bourne He intentado incluyendo guión, ksh, varias versiones de Bash, BusyBox ash, zsh (con -y) e incluso el Heirloom Bourne Shell.

INET_NTOA() { 
    num=$1 
    ip= 
    for e in 3 2 1 
    do 
     quad=`echo "256^$e" | bc` 
     if [ -n "$ip" ] 
     then 
      ip=$ip. 
     fi 
     ip=$ip`echo "$num/$quad" | bc` 
     num=`echo "$num % $quad" | bc` 
    done 
    ip=$ip.$num 
    echo "$ip" 
} 

INET_ATON() 
{ 
    num=0 
    e=3 
    saveIFS=$IFS 
    IFS=. 
    set -- $1 
    IFS=$saveIFS 
    for ip in "[email protected]" 
    do 
     num=`echo "$num + $ip * 256^$e" | bc` 
     e=`echo "$e - 1" | bc` 
    done 
    echo "$num" 
} 
+1

+1, gracias por estas funciones! Si intenta enmascarar con números enteros grandes, puede encontrarse con problemas de envolvente. La aplicación de la solución en [esta respuesta] (http://stackoverflow.com/questions/210629/python-unsigned-32-bit-bitwise-arithmetic) corrige ese problema. P.ej. 'INET_NTOA $ ((($ (INET_ATON 192.168.1.12) | ~ $ (INET_ATON 255.255.255.0)))) produce' -63.-87.-254.-1', pero 'INET_NTOA $ ((($ (INET_ATON 192.168.1.12) | ~ $ (INET_ATON 255.255.255.0)) & 0xFFFFFFFF)) 'produce' 192.168.1.255' que es lo que desea. – bstpierre

+0

Cuando traté de ejecutar esto en shell, no funcionó, tiene un problema con las siguientes líneas: 'echo" $ {ip [*]} "' y 'ip = ($ 1)' – ArmenB

+0

@Armen: Which shell are ¿Estás usando y qué tipo de problema? Por favor, publique un mensaje de error específico. Es probable que esté utilizando un shell que no admite matrices o utiliza una sintaxis diferente. –

3
 
INET_ATON() 
    { 
    local IFS=. ipStr 

    ipStr=($1) 
    echo $(($(($(($(($(($((${ipStr[0]} * 256)) + ${ipStr[1]})) * 256)) + ${ipStr[2]})) * 256)) + ${ipStr[3]})) 
    } 

INET_NTOA() 
    { 
    echo "$(($1/16777216)).$(($(($1 % 16777216))/65536)).$(($(($1 % 65536))/256)).$(($1 % 256))" 
    } 

subnetRange() 
    { 
    local addr=$(INET_ATON "$1") mask=$(INET_ATON "$2") 

    echo "$(INET_NTOA $(($addr & $mask))) $(INET_NTOA $(($addr | $mask^4294967295)))" 
    } 


+2

No hay necesidad de todos los adicionales '$ (())' anidados. –

1

Teniendo en cuenta que la pregunta original era alrededor de una eficiente manera de hacer esto en bash, creo que estos podrían ser entradas dignas en el concurso:

INET_ATON() 
    { 
    local IFS=. ip 
    ip=($*) 
    echo $(((ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3])) 
    } 

INET_NTOA() 
    { 
    echo $(($1 >> 24)).$((($1 >> 16) % 256)).$((($1 >> 8) % 256)).$(($1 % 256)) 
    } 

Naturalmente, estos han el mismo problema de "envoltura" que las otras soluciones dadas aquí, debido al tratamiento de los enteros según lo expresado en el intérprete de comandos.

0

soy flojo, y esto ya se ha hecho. Así que desde un shell

$ ping -c1 1199092913 | head -n1 | grep -Eow "[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+" 

estoy seguro de que hay otras maneras inteligentes de hacerlo desde el caparazón también.

Cuestiones relacionadas