11
votes

Convertisseur d'adresse IP

Il existe une adresse IP: 66.102.13.19, et à partir de cette adresse, comme cela a reçu cette adresse xxx

mais comment? Et comment je peux en faire cela avec l'aide de Bash. Par exemple, Ce service peut le faire, mais je ne comprends pas l'algorithme.


0 commentaires

7 Réponses :


37
votes
#!/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)
}

16 commentaires

@Ashburlaczenko: le nombre décimal pour l'adresse IP donnée est 1113984275


Merci pour votre décision, plus claire, j'ai corrigé l'erreur. Et comment faire l'opération inverse? À partir du 1113984275 pour obtenir le 66.102.13.19.


@Ammenb.: Je ne sais pas ce que vous demandez, mais oui, typiquement tout ce qui peut être fait dans un script shell peut être effectué à la ligne de commande et inversement. Il y a des exceptions ou des cas où les choses doivent être faites un peu différemment. Dans ce cas, vous pouvez inclure les fonctions (juste la définition de fonction omettez le shebang et l'appel à la fonction) dans un fichier tel que ~ / bin / fonction et la source de votre ~ ~ /.bashrc en utilisant . $ Home / bin / fonction (remarquez le point). Ensuite, vous pouvez appeler les fonctions de la ligne de commande comme ceci: IP2Dec 66.102.13.19 , par exemple.


Si vous voulez dire une coque différente autre que Bash, alors oui, mais il peut être nécessaire de réécrire si l'autre shell n'a pas les mêmes caractéristiques que Bash qui sont utilisées ici.


@Dennis: Oui par d'autres autres shell je voulais dire sh pas bash . Je cherche un moyen de faire ceci est la coquille de vanille.


@Armenb .: Malheureusement, la coque de Bourne ne prend pas en charge les tableaux (bien que vous puissiez utiliser définir et les paramètres de position) et ni cela ni Expr Exproniation de support. En outre, différentes versions des coques dérivées de Bourne (ou non) une variété d'autres caractéristiques. Donc, pour obtenir quelque chose d'utilisable, j'ai ajouté des versions AWK. J'espère qu'ils travaillent avec la version de AWK que vous utilisez.


Je pense que cela serait mieux exprimé par des fonctions binaires (<<) plutôt que des exposants.


Notez de la propriété intellectuelle à la décimale à la valeur de DEC avant la boucle, sinon elle continue d'augmenter :)


@shasharsol: Si vous vous référez à la version AWK de ip2dec , déc est initialisé automatiquement à une valeur null lorsque le commence clause d'abord rencontres ce. Si vous l'utilisez à l'extérieur commencer peut-être en définissant une fonction, vous auriez probablement besoin d'initialiser explicitement.


La multiplication est lente, une alternative plus rapide consiste à utiliser le décalage de bits (une commande ONE OPCODE à la plupart des processeurs) printf '% d \ n' "$ ((((a << 24) + (B << 16) + ( c << 8) + d)) "


@Isaac: Mais ce n'est pas c, c'est bash. Avez-vous réellement testé la différence? Pour moi, à Bash 4.4, ma multiplication est d'environ 15% plus rapide que vos changements. temps pour i in {1..1000000}; Printf '% s% d \ n' "http: //" "$ ((A * 256 ** 3 + B * 256 ** 2 + C * 256 + D))"; fait> / dev / null


J'aurais dû tester plus longtemps. Était plus rapide en ksh. Voici une comparaison des coquilles: Essayez-le en ligne!


Cela montre une petite amélioration de KSH et de ZSH, mais pas si grosse. En tout cas, cela ne fonctionne pas dans le tiret (que je n'ai pas mentionné auparavant) car DASH n'a pas l'opérateur d'exponentiation ( ** ). Peut-être que vous aimerez la version compatible Dash de D + (C + (B + A * 256) * 256) * 256


@Isaac: Wow, ZSH est lent!


Vous voulez une coquille rapide?


Il y a un problème avec votre script IP2Dec. Il ajoute un zéro traînant à la fin.



12
votes

Adresse IP -> Numéro:

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


3 commentaires

C'est génial, mais comment faisons-nous l'inverse. I.E. Numéro IP -> Adresse IP


J'ai mis à jour la méthode de la façon de convertir le numéro IP en adresse IP. :)


Vous pouvez éviter l'appel à tr en spécifiant le séparateur d'enregistrement, à savoir: awk 'commencer {rs = "."} ... ou awk' { S = S * 256 + 1 $} fin {imprimé s} 'rs =.



3
votes

Ma version pour INT vers la conversion IP:

echo 3232235521 | awk {'print rshift (et (1 $, 0XFF000000), 24) "". rshift (et (1 $, 0x00FF0000), 16) "." rshift (et (1 $, 0x0000FF00), 8) "". et (1 $, 0x000000FF) '}


0 commentaires

3
votes

Voici ma prise: xxx

ip2d.sh: xxx

d2ip.sh: xxx < / pré>


2 commentaires

Aimer. IP2D pourrait être une fonction (Bash) comme ip2d () {ifs =. Eval 'Set - 1 $'; echo ... et D2IP pourrait également être écrit ifs = \ lisez -r a b c d << (echa "obase = 256; 1 $" "| BC)


Et à nouveau plus court: a = ($ (DC -E "256o $ 1p")); ifs =. eval 'echo "$ {A [*] # 0}"' (avoir le même problème que l'original lorsqu'un quad a deux principaux 0).



1
votes

Je pense qu'il y a une solution plus simple qui gère également un nombre arbitraire d'octets sans références à des décalages fixes, etc. xxx

sortie: 1113984275


2 commentaires

Bonjour, j'ai une question sur votre réponse. Pouvez-vous expliquer la signification du $ ((2 # $ (cat)))


@yundongxu La commande chat lit les données de la conduite de données dans une entrée standard qui est une chaîne de chiffres binaires. L'expression $ (((2 # ...)) convertit "..." de la base 2 à la décimale.



4
votes

Le changement binaire est toujours plus rapide que de multiplier ou de diviser.
Utilisation d'un binaire et est plus rapide que MOD.

ip2dec(){ # Convert an IPv4 IP number to its decimal equivalent.
          local a b c d;
          IFS=. read a b c d <<-_EOF_
$1
_EOF_
          echo "$(((a<<24)+(b<<16)+(c<<8)+d))";
        }

dec2ip(){   # Convert an IPv4 decimal IP value to an IPv4 IP.
            local a=$((~(-1<<8))) b=$1; 
            set -- "$((b>>24&a))" "$((b>>16&a))" "$((b>>8&a))" "$((b&a))";
            local IFS=.;
            echo "$*";
        }

ip=$1
a=$(ip2dec "$ip")
b=$(dec2ip "$a")
echo "$ip DecIP=$a IPv4=$b "


2 commentaires

Aux variables de nettoyage a , b , c et d à partir de (code> 0 et prévenir Interprétation octale, vous pouvez faire: ((a = 10 # $ a $ a, b = 10 # $ b, c = 10 # $ c, d = 10 # $ d)) . Voir: Stackoverflow.com/questions/11123717/... ou non DÉCLARCARE -I ECHO" $ (( (10 # $ A << 24) + (10 # $ b << 16) + (10 # $ C << 8) + 10 # $ d)) ";


Pourquoi avoir la peine d'appeler définir dans déc200 ? Echo ça tout de suite les points entre ... echo "$ ((b >> 24 et a)). $ ((B >> 16 et a)). $ ((B >> 8 et a))". $ ((B & A)) "



2
votes

Simple Int à la conversion IP pour Bash

dec2ip ()
{
   local v=$1
   local i1=$((v>>24&255))
   local i2=$((v>>16&255))
   local i3=$((v>>8&255))
   local i4=$((v&255))
   printf '%d.%d.%d.%d\n' $i1 $i2 $i3 $i4
}


0 commentaires