¿Cómo es que los 0 que faltan se agregan automáticamente en las direcciones IP? (`ping 10.5` equivalente a` ping 10.0.0.5`)

36

Accidentalmente escribí

ssh 10.0.05

en lugar de

ssh 10.0.0.5

y me sorprendió mucho que funcionara. También probé 10.005y 10.5y esos también se expandieron automáticamente a 10.0.0.5. También lo intenté 192.168.1y eso se expandió a 192.168.0.1. Todo esto también funcionó en pinglugar de hacerlo ssh, por lo que sospecho que funcionaría para muchos otros comandos que se conectan a un host arbitrario suministrado por el usuario.

¿Por qué funciona esto? ¿Está este comportamiento documentado en alguna parte? ¿Es este comportamiento parte de POSIX o algo así? ¿O es solo una implementación extraña? (Usando Ubuntu 13.10 para lo que vale).

Nicu Stiurca
fuente

Respuestas:

43

Citando 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).

Por diversión, prueba esto:

$ 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
fuente
2
En cuanto a por qué, es proporcionar una forma más útil de representar direcciones en redes de clase A, B, C. Por ejemplo, 127.1 es la dirección de bucle invertido en la red de bucle invertido clase A 127.0 / 8 que comprende los 16 millones de direcciones 127.0 a 127.0xffffff. Y en la red 192.168.0 / 16 clase B, generalmente tendrá las direcciones 192.168.1 a 192.168.65534. La dirección INADDR_ANY es 0, la dirección de transmisión DHCP 0xffffffff, que son más cortas de escribir, etc.
Stéphane Chazelas
44
Hombre, deseo que los usuarios prueben http: // 1249767214 antes de hacer preguntas simples como esta.
blahdiblah
21

Agregando a la excelente respuesta de @ devnull , las direcciones IPv4 se pueden representar de las siguientes maneras.

Ejemplo

Este nombre de dominio google.com, se puede representar de las siguientes maneras:

  • 74.125.226.4  (decimal punteado)
  • 1249763844  (decimal plano)
  • 0112.0175.0342.0004  (octal punteado)
  • 011237361004  (octal plano)
  • 0x4A.0x7D.0xE2.0x04  (hexágono punteado)
  • 0x4A7DE204  (hexágono plano)
  • 74.0175.0xe2.4  (ಠ_ಠ)

Fuente: ¿Por qué el ping 192.168.072 (solo 2 puntos) devuelve una respuesta de 192.168.0.58? .

slm
fuente
3
Mezclar octal y decimal es el trabajo del diablo.
Nit
44
Un nombre de dominio no es, en ningún sentido, una dirección IPv4.
David Conrad
@DavidConrad: pensé que era algo obvio, ya que no es numérico. Lo dejó más claro para aquellos que no saben tihs.
slm