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 ??). P>
REMARQUE: Spécifiquement, ne voulez pas appeler Perl, AWK ou une autre «langue». P>
6 Réponses :
Voir le inet_ntoa Code> fonction, vous pouvez l'utiliser pour convertir le numéro en une adresse IP sur le serveur MySQL. P>
Merci! N'a pas réalisé que vous pouvez réellement passer le champ MySQL à INET_NTOA.
Supposons que vous ayez un champ appelé p> ferait la requête et le remise en pointillé Quad IPS dans le jeu de résultats. P> P> ip_addr code> dans une table appelée héberges code>
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"
}
+1, merci pour ces fonctions! Si vous essayez de faire du masquage avec de gros entiers, vous pouvez rencontrer des problèmes enveloppants. Appliquer la solution de contournement dans
Quand j'ai essayé de courir cela dans Shell, il n'a pas fonctionné, il a un problème avec les lignes suivantes: echo "$ {ip [*]}" code> et ip = ($ 1) Code>
@ARMEN: Quelle coquille utilisez-vous et quel type de problème? Veuillez poster un message d'erreur spécifique. Il est probable que vous utilisiez une coquille qui ne prend pas en charge les tableaux ou utilise une syntaxe différente.
@Dennis: C'est correct, je n'utilise plus Bourne Shell, im en utilisant Vanilla Shell. Le message d'erreur indique "attendre} avant [" et similaire.
@Armenb.: J'ai ajouté une version qui devrait fonctionner dans votre shell.
Excellente utilisation d'arithmétiques purs dans Bash! J'approuve :-)
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)))"
}
Il n'y a pas besoin de tous ces $ ((() $) code>.
É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))
}
Je suis paresseux, et cela a déjà été fait. Donc, d'une coque Je suis sûr qu'il existe d'autres moyens intelligents de le faire de Shell. P> P>