Como é que 0s ausentes são adicionados automaticamente aos endereços IP? (`ping 10.5` equivalente a` ping 10.0.0.5`)

36

Digitei acidentalmente

ssh 10.0.05

ao invés de

ssh 10.0.0.5

e fiquei muito surpreso que funcionou. Eu também tentei 10.005e 10.5e aqueles também expandiu automaticamente 10.0.0.5. Eu também tentei 192.168.1e isso expandiu para 192.168.0.1. Tudo isso também funcionou em pingvez de ssh, então eu suspeito que funcionaria para muitos outros comandos que se conectam a um host arbitrário fornecido pelo usuário.

Por que isso funciona? Esse comportamento está documentado em algum lugar? Esse comportamento faz parte do POSIX ou algo assim? Ou é apenas uma implementação estranha? (Usando o Ubuntu 13.10 para o que vale a pena.)

Nicu Stiurca
fonte

Respostas:

43

Citação 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 diversão, tente o seguinte:

$ 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
fonte
2
Quanto ao motivo, é fornecer uma maneira mais útil de representar endereços nas redes das classes A, B, C. Por exemplo, 127.1 é o endereço de loopback na rede de loopback da classe A 127.0 / 8, que compreende os 16 milhões de endereços 127.0 a 127.0xffffff. E na rede 192.168.0 / 16 classe B, você normalmente terá os endereços 192.168.1 a 192.168.65534. O endereço de INADDR_ANY é 0, o endereço 0xffffffff transmissão DHCP que são mais curtos para digitar, etc.
Stéphane Chazelas
4
Cara, eu gostaria que os usuários tentassem http: // 1249767214 antes de fazer perguntas simples como esta.
blahdiblah
21

Adicionando à boa resposta de @ devnull , os endereços IPv4 podem ser representados das seguintes maneiras.

Exemplo

Este nome de domínio,, google.compode ser representado das seguintes maneiras:

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

Fonte: Por que o ping 192.168.072 (apenas 2 pontos) retorna uma resposta do 192.168.0.58? .

slm
fonte
3
Misturar octal e decimal é o trabalho do diabo.
Nit
4
Um nome de domínio não é, de forma alguma, um endereço IPv4.
David Conrad
@ DavidConrad - eu pensei que era meio óbvio, uma vez que não é numérico. Tornou mais claro para aqueles que não o conhecem.
Slm