7
votes

Comment convertir efficacement Int long to en pointillé Quad IP à Bash

J'ai beaucoup d'adresses IP dans un grand dB MySQL stocké au moins longtemps. J'ai besoin d'un moyen efficace / rapide de les convertir à une adresse IP au sein d'un script BASH Shell (ou de renvoyer MySQL les résultats comme une adresse IP ??).

REMARQUE: Spécifiquement, ne voulez pas appeler Perl, AWK ou une autre «langue».


0 commentaires

6 Réponses :


11
votes

Voir le inet_ntoa fonction, vous pouvez l'utiliser pour convertir le numéro en une adresse IP sur le serveur MySQL.


1 commentaires

Merci! N'a pas réalisé que vous pouvez réellement passer le champ MySQL à INET_NTOA.



1
votes

Supposons que vous ayez un champ appelé ip_addr dans une table appelée héberges

xxx

ferait la requête et le remise en pointillé Quad IPS dans le jeu de résultats.


0 commentaires

15
votes

Depuis que vous avez demandé à BASH:

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 "$@"
    do
        num=`echo "$num + $ip * 256 ^ $e" | bc`
        e=`echo "$e - 1" | bc`
    done
    echo "$num"
}



3
votes
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)))"
  }



1 commentaires

Il n'y a pas besoin de tous ces $ ((() $) .



1
votes

Étant donné que la question initiale était à propos d'un moyen em> efficace em> de le faire dans Bash, je pense que celles-ci pourraient être dignes d'entrées dans le concours:

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


0 commentaires

0
votes

Je suis paresseux, et cela a déjà été fait. Donc, d'une coque xxx

Je suis sûr qu'il existe d'autres moyens intelligents de le faire de Shell.


0 commentaires