Explication de convertisseur de cidr pour le masque de réseau sous linux shell netmask2cdir et cdir2netmask
J'ai trouvé le shell suivante des fonctions à partir de ce sujet
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the mask
local x=${1##*255.}
set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
x=${1%%$3*}
echo $(( $2 + (${#x}/4) ))
}
cdr2mask ()
{
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
Pourriez-vous expliquer en détails comment ces fonctions convertissent cidr pour le masque de réseau et le masque de réseau pour cidr? Plus précisément, les appels à set
, le paramètre d'expansion ${#…}
, et l'expansion arithmétique $((…))
sont assez écrasante.
De toute partie, ou avez-vous juste de ne pas comprendre une partie de la création de scripts shell?
l'ensemble du code n'est pas clair pour moi
Je ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
Je ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
l'ensemble du code n'est pas clair pour moi
Je ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
Je ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
ne sais pas pourquoi vous avez fermé à cette question, mais c'est une bonne question et la réponse est wonerful
OriginalL'auteur MOHAMED | 2013-12-24
Vous devez vous connecter pour publier un commentaire.
mask2cdr()
Pour obtenir le CIDR préfixe à partir d'un point-virgule masque de réseau comme celui-ci:
vous devez d'abord convertir les quatre octets en binaire puis de compter les bits les plus significatifs (c'est à dire le nombre de meneurs):
Cette fonction ne fait que plutôt de façon créative. Tout d'abord, nous dépouiller tous les
255
octets (c'est à dire les octets qui sont toutes en binaire) et de stocker les résultats dans une variablex
:Cette étape utilise paramètre d'extension, le script s'appuie sur assez fortement. Si nous continuons avec notre exemple, le masque de réseau de
255.255.192.0
, maintenant, nous avons les valeurs suivantes:Ensuite, nous avons défini trois variables:
$1
,$2
, et$3
. Ceux-ci sont appelés les paramètres positionnels; ils sont plus comme de simples variables nommées, mais sont généralement défini lorsque vous passez des arguments d'un script ou d'une fonction. Nous pouvons définir les valeurs directement à l'aide deset --
, par exemple:Je préfère utiliser des variables nommées sur les paramètres positionnels, car cela fait des scripts plus facile à lire et à déboguer, mais le résultat final est le même. Nous avons mis
$1
:C'est vraiment juste une table pour convertir certaines valeurs décimales en binaire et le nombre de
1
bits. Nous y reviendrons plus tard.Nous avons mis
$2
àCe qui est appelé L'Expansion Arithmétique. Il semble complexe, mais il est vraiment juste de compter le nombre de
1
bits que nous enlevée lors de la première commande. Il se décompose à ceci:qui dans notre cas correspond à
Nous avons dépouillé de deux octets afin d'obtenir 16. Du sens.
Nous avons mis
$3
:qui est la valeur de
$x
avec tout ce qui est après la première.
dépouillé. Dans notre cas, c'est192
.Nous avons besoin de convertir ce nombre en binaire et compter le nombre de
1
bits, donc, revenons à notre "tableau de conversion." Nous pouvons diviser la table en l'égalité des morceaux de quatre caractères:En binaire, les chiffres ci-dessus sont:
Si on compte à partir de la gauche, de chaque quatre-bloc de caractères dans le tableau correspond à un supplément de
1
bits en binaire. Nous essayons de convertir192
, donc tout d'abord lop off la partie droite de la table, de la192
sur, et de le stocker dansx
:La valeur de
$x
est maintenantqui contient de deux à quatre caractères de blocs, ou deux
1
bits en binaire.Maintenant nous avons juste besoin d'ajouter la
1
bits à partir de nos principaux255
octets (16 total, stockés dans la variable$2
) et le1
bits à partir de l'étape précédente (2 au total):où
est le nombre de caractères dans
$x
divisé par quatre, c'est à dire le nombre de quatre caractères blocs dans$x
.De sortie:
cdr2mask()
Nous allons continuer à courir avec notre exemple précédent, qui avait une CIDR préfixe de
18
.Nous utilisons
set --
pour définir les paramètres positionnels de $1 à $9:Nous allons examiner les formules utilisées pour définir
$1
et$6
d'un peu plus près.$1
est fixé à:Le maximum et le minimum des valeurs possibles d'un CIDR préfixe sont 32 pour le masque de réseau
et 0 pour le masque de réseau
La formule ci-dessus utilise la division entière, de sorte que les résultats possibles vont de 1 à 5:
$6
est fixé à:Analysons tout cela pour notre exemple CIDR préfixe de
18
. D'abord nous prenons le module et faire la soustraction:Ensuite, nous bit à bit shift 255 par cette valeur:
C'est la même chose que de pousser six
0
de bits sur la fin de 255 en binaire:Enfin, nous avons au niveau du bit ET cette valeur avec 255:
qui donne
ou tout simplement
Semble familière? C'est le troisième octet dans notre masque en binaire:
En décimal, la valeur est de 192.
Ensuite, nous décalage de la position des paramètres basés sur la valeur de
$1
:Dans notre cas, la valeur de
$1
est 3, donc on décale les paramètres positionnels de 3 à gauche. La valeur précédente de$4
devient la nouvelle valeur de$1
, la valeur précédente de$5
devient la valeur de$2
, et ainsi de suite:Ces valeurs devrait vous être familier: ils sont la virgule octets à partir de notre masque de sous-réseau avec un couple de zéros supplémentaires ajouté à la fin). Pour obtenir le masque de réseau, nous avons tout simplement imprimer les quatre premiers, avec des points entre eux:
La
-0
après chaque paramètre est dit d'utiliser0
que la valeur par défaut si le paramètre n'est pas défini.De sortie:
C'est une excellente réponse. Je l'ai utilisé comme base pour la conversion du "code ont joué au golf" formulaire pour un plus verbeux "les noms de variables que de la documentation". Vous pouvez voir que dans ce résumé: gist.github.com/RichardBronosky/...
OriginalL'auteur ThisSuitIsBlackNot