calcul netmask

Le
Christophe PEREZ
Bonjour,

Je cherche un outil, pour qu'en ligne de commande, je puisse trouver le
netmask correspondant à 1 range d'adresses IP, genre :
$ mon_outil 192.168.0.1 192.168.0.255
192.168.0.1/24

J'en trouve plein qui fonctionnent dans l'autre sens, comme ipcalc, et la
requête google à faire ne me saute pas aux yeux ;)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #26333034
Bonjour,

Le 09/01/2015 22:23, Christophe PEREZ a écrit :

Je cherche un outil, pour qu'en ligne de commande, je puisse trouver le
netmask correspondant à 1 range d'adresses IP, genre :
$ mon_outil 192.168.0.1 192.168.0.255
192.168.0.1/24

J'en trouve plein qui fonctionnent dans l'autre sens, comme ipcalc, et la
requête google à faire ne me saute pas aux yeux ;)



Je n'ai pas de solution toute faite, mais voici comment je procèderais
si je devais le faire.

1) traduire les adresses IP de début et de fin en binaire

192 168 0 1 -> 11000000 10101000 00000000 00000001
192 168 0 255 -> 11000000 10101000 00000000 11111111

2) Compter le nombre de chiffres identiques à partir du
début -- stopper dès que les chiffres diffèrent.

Il y en a 24


Note qu'il n'est pas forcément utile de tout traduire en binaire.
Tant que les nombres de l'adresse IP sont identiques, tu peux
ajouter 8 pour chaque nombre ; dès qu'ils diffèrent, tu regardes
les premiers bits identiques (entre 0 et 7) de ce nombre.

Je prends un autre exemple : 192.168.80.1 à 192.168.95.255

*) 192 = 192 : 8 bits
*) 168 = 168 : 8 + 8 bits = 16 bits
*) 80 != 95 :
80 = 01010000
95 = 01011111
Les 4 premiers bits sont identiques : 16 + 4 bits = 20 bits
*) Inutile de regarder le 4e octet

Donc 192.168.80.1/20
Baton .rouge
Le #26333038
On Fri, 9 Jan 2015 21:23:46 +0000 (UTC), Christophe PEREZ

Bonjour,

Je cherche un outil, pour qu'en ligne de commande, je puisse trouver le
netmask correspondant à 1 range d'adresses IP, genre :
$ mon_outil 192.168.0.1 192.168.0.255
192.168.0.1/24

J'en trouve plein qui fonctionnent dans l'autre sens, comme ipcalc, et la
requête google à faire ne me saute pas aux yeux ;)



pas testé, mais du côté excel ?
http://trk.free.fr/ipcalc/

--
Les assistés du CAC 40 :
http://www.youtube.com/watch?feature=player_detailpage&v=W5Yx_diRxA8#tH
Christophe PEREZ
Le #26333049
Le Fri, 09 Jan 2015 23:43:18 +0100, Baton .rouge a écrit :

pas testé, mais du côté excel ?
http://trk.free.fr/ipcalc/



Euh... je veux pouvoir traiter ça en ligne de commande.
Sinon, même en ligne il y a des outils qui le font très bien comme http://
www.hobbesworld.com/reseaux/calcip.php#rech
Christophe PEREZ
Le #26333048
Le Fri, 09 Jan 2015 23:06:13 +0100, Olivier Miakinen a écrit :

Hahaha je te reconnais rien là toi.

Je n'ai pas de solution toute faite, mais voici comment je procèderais
si je devais le faire.



C'est très gentil de m'expliquer la méthode, qui j'avoue humblement, ne
fait pas partie de mes connaissances, mais
1) j'imagine bien qu'un outil ou même un script existe déjà sans que j'ai
à réinventer la roue
2) tu m'envoies faire ça en bash toi ? C'est sympa :D

Bon, si jamais je ne trouve pas du tout fait, je serai bien obligé de me
forcer à y passer et je serai bien content de retrouver tes explications,
mais je croise encore un peu les doigts :)
Erwan David
Le #26333058
Christophe PEREZ
Bonjour,

Je cherche un outil, pour qu'en ligne de commande, je puisse trouver le
netmask correspondant à 1 range d'adresses IP, genre :
$ mon_outil 192.168.0.1 192.168.0.255
192.168.0.1/24

J'en trouve plein qui fonctionnent dans l'autre sens, comme ipcalc, et la
requête google à faire ne me saute pas aux yeux ;)



La dernière version de ipcalc (0.41) le fait

ipcalc 192.168.0.1 - 192.168.0.255
deaggregate 192.168.0.1 - 192.168.0.255
192.168.0.1/32
192.168.0.2/31
192.168.0.4/30
192.168.0.8/29
192.168.0.16/28
192.168.0.32/27
192.168.0.64/26
192.168.0.128/25

Car le /24 contient aussi le 192.168.0.0, donc il te donne les réseaux
correspondant au range que tu as donné


ipcalc 192.168.0.0 - 192.168.0.255
deaggregate 192.168.0.0 - 192.168.0.255
192.168.0.0/24


--
Les simplifications c'est trop compliqué
moi-meme
Le #26333061
Le Sat, 10 Jan 2015 05:32:45 +0000, Christophe PEREZ a écrit :

C'est très gentil de m'expliquer la méthode, qui j'avoue humblement, ne
fait pas partie de mes connaissances



Avec tout le respect que je vous dois : faire de l'informatique de bas
niveau et ne pas connaître les bases de la numération, c'est le moment
d'apprendre : cela pourra certainement resservir :-)

Un journée où on n'a rien appris est une journée de perdue.
Doug713705
Le #26333118
Le 10-01-2015, Christophe PEREZ nous expliquait dans
fr.comp.os.linux.configuration
(
Le Fri, 09 Jan 2015 23:06:13 +0100, Olivier Miakinen a écrit :

Hahaha je te reconnais rien là toi.

Je n'ai pas de solution toute faite, mais voici comment je procèderais
si je devais le faire.



C'est très gentil de m'expliquer la méthode, qui j'avoue humblement, ne
fait pas partie de mes connaissances, mais
1) j'imagine bien qu'un outil ou même un script existe déjà sans que j'ai
à réinventer la roue
2) tu m'envoies faire ça en bash toi ? C'est sympa :D

Bon, si jamais je ne trouve pas du tout fait, je serai bien obligé de me
forcer à y passer et je serai bien content de retrouver tes explications,
mais je croise encore un peu les doigts :)



À peine 50 lignes de python:

####################################################################################

#! /usr/bin/env python3

import sys
import re

def usage():
print("Usage:t", sys.argv[0], "<IP address> <IP address>")
exit(0)

def check_ip(ip):
if re.match("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", ip) is not None:
ip_bytes = ip.split(".")
for byte in ip_bytes:
if not -1 < int(byte) < 256:
usage()
return ip_bytes
else:
usage()

def to_binary(ip_bytes):
str = ""
for byte in ip_bytes:
binary = "{0:b}".format(int(byte))
while len(binary) < 8:
binary = "0" + binary
str += binary
return str

def get_mask(bin_ip1, bin_ip2):
i = 0
mask = 0
for bit in bin_ip1:
if bit == bin_ip2[i]:
mask += 1
else:
return mask
i += 1

if len(sys.argv) < 3:
usage()
else:
ip_1 = check_ip(sys.argv[1])
ip_2 = check_ip(sys.argv[2])

bin_ip1 = to_binary(ip_1)
bin_ip2 = to_binary(ip_2)

print(sys.argv[1]+"/"+str(get_mask(bin_ip1, bin_ip2)))

####################################################################################


Ce n'est probablementpas très optimisé mais ça fonctionne.


--
C'est juste une fille un peu frittée
Qui s'amuse avec ma santé
Et qui me dégoupille les gonades
Juste au moment où je prends mon fade.
-- H.F. Thiéfaine, Groupie 89 turbo 6
Christophe PEREZ
Le #26333142
Le Sat, 10 Jan 2015 08:37:57 +0000, moi-meme a écrit :

Un journée où on n'a rien appris est une journée de perdue.



J'apprends plein de choses tous les jours, mais j'évite de me forcer à
apprendre des choses qui ne m'intéressent pas plus que ça, parce que
justement, il y a beaucoup trop de choses qu'il m'intéresse d'apprendre.
Christophe PEREZ
Le #26333148
Le Sat, 10 Jan 2015 09:30:06 +0100, Erwan David a écrit :

La dernière version de ipcalc (0.41) le fait



Ah ben m$#!&$ alors ! J'ai passé un moment à tourner la doc pour trouver
la bonne option, et n'y trouvant rien, j'ai pensé qu'il ne le faisait
pas, et pourtant, ça me surprenait vachement.
Merci d'avoir mis le doigt dessus.
Christophe PEREZ
Le #26333147
Le Sat, 10 Jan 2015 11:57:50 +0100, Doug713705 a écrit :

À peine 50 lignes de python:



Désolé que tu te sois donné tout ce mal pour rien, mais puisqu'Erwan me
fait remarquer qu'ipcalc le fait...
Publicité
Poster une réponse
Anonyme