Comment se fait-il que les 0 manquants soient automatiquement ajoutés aux adresses IP? (`ping 10.5` équivalent à` ping 10.0.0.5`)

36

J'ai accidentellement tapé

ssh 10.0.05

au lieu de

ssh 10.0.0.5

et était très surpris que cela a fonctionné. J'ai aussi essayé 10.005et 10.5et ceux aussi élargi automatiquement 10.0.0.5. J'ai aussi essayé 192.168.1et cela s'est étendu à 192.168.0.1. Tout cela a également fonctionné avec pingplutôt que ssh, alors je suppose que cela fonctionnerait pour beaucoup d'autres commandes qui se connectent à un hôte arbitraire fourni par l'utilisateur.

Pourquoi ça marche? Ce comportement est-il documenté quelque part? Ce comportement fait-il partie de POSIX ou de quelque chose? Ou est-ce juste une implémentation étrange? (Utiliser Ubuntu 13.10 pour ce que ça vaut.)

Nicu Stiurca
la source

Réponses:

43

Citant de man 3 inet_aton:

   a.b.c.d   Each of the four numeric parts specifies a byte of the
             address; the bytes are assigned in left-to-right order to
             produce the binary address.

   a.b.c     Parts a and b specify the first two bytes of the binary
             address.  Part c is interpreted as a 16-bit value that
             defines the rightmost two bytes of the binary address.
             This notation is suitable for specifying (outmoded) Class B
             network addresses.

   a.b       Part a specifies the first byte of the binary address.
             Part b is interpreted as a 24-bit value that defines the
             rightmost three bytes of the binary address.  This notation
             is suitable for specifying (outmoded) Class C network
             addresses.

   a         The value a is interpreted as a 32-bit value that is stored
             directly into the binary address without any byte
             rearrangement.

   In all of the above forms, components of the dotted address can be
   specified in decimal, octal (with a leading 0), or hexadecimal, with
   a leading 0X).  Addresses in any of these forms are collectively
   termed IPV4 numbers-and-dots notation.  The form that uses exactly
   four decimal numbers is referred to as IPv4 dotted-decimal notation
   (or sometimes: IPv4 dotted-quad notation).

Pour le plaisir, essayez ceci:

$ nslookup unix.stackexchange.com
Non-authoritative answer:
Name:   unix.stackexchange.com
Address: 198.252.206.140

$ echo $(( (198 << 24) | (252 << 16) | (206 << 8) | 140 ))
3338456716

$ ping 3338456716         # What?  What did we ping just now?
PING stackoverflow.com (198.252.206.140): 48 data bytes
64 bytes from 198.252.206.140: icmp_seq=0 ttl=52 time=75.320 ms
64 bytes from 198.252.206.140: icmp_seq=1 ttl=52 time=76.966 ms
64 bytes from 198.252.206.140: icmp_seq=2 ttl=52 time=75.474 ms
devnull
la source
2
Quant à pourquoi, il s'agit de fournir un moyen plus utile de représenter les adresses dans les réseaux de classe A, B, C. Par exemple, 127.1 est l'adresse de bouclage dans le réseau de bouclage de classe A 127.0 / 8 qui comprend les 16 millions d'adresses 127,0 à 127,0xffffff. Et sur le réseau 192.168.0 / 16 classe B, vous aurez généralement les adresses 192.168.1 à 192.168.65534. L'adresse INADDR_ANY est 0l'adresse de diffusion DHCP 0xffffffff qui est plus courte à taper, etc.
Stéphane Chazelas
4
Man, je souhaite que les utilisateurs essaient http: // 1249767214 avant de poser des questions simples comme celle-ci.
Blahdiblah
21

En ajoutant à la réponse précise de @ devnull , les adresses IPv4 peuvent être représentées des manières suivantes.

Exemple

Ce nom de domaine google.com, peut être représenté de la manière suivante:

  • 74.125.226.4  (point décimal)
  • 1249763844  (décimal plat)
  • 0112.0175.0342.0004  (octal pointillé)
  • 011237361004  (octal plat)
  • 0x4A.0x7D.0xE2.0x04  (hex en pointillé)
  • 0x4A7DE204  (hexagone plat)
  • 74.0175.0xe2.4  (_ಠ)

Source: Pourquoi le ping 192.168.072 (2 points seulement) renvoie-t-il une réponse de 192.168.0.58? .

slm
la source
3
Mélanger octal et décimal est le travail du diable.
Nit
4
Un nom de domaine n'est en aucun cas une adresse IPv4.
David Conrad
@ DavidConrad - Je pensais que c'était assez évident, car ce n'est pas numérique. Plus clair pour ceux qui ne le savent pas.
slm