Quelle est mon adresse IP?

24

Je suis surpris que cela n'ait pas encore posé de problème.

Sortez l'adresse IP de la machine que vous utilisez. Vous devez sortir les adresses IP locales et externes.

Adresse IP locale, c'est-à-dire selon le format par défaut 192.168.xx

L'adresse IP publique peut être vérifiée en utilisant google https://www.google.co.uk/search?source=hp&q=whats+my+ip

La sortie peut être dans n'importe quel format. IPv4 ou IPv6 ou tout mélange de chacun est autorisé, mais ils doivent être la seule sortie. Le code peut être un programme complet ou une fonction.

règles de s'appliquent donc le code le plus court l'emporte.

Les échappatoires standard sont interdites.

EDIT: Selon le commentaire de @Peter Taylor, dans le cas où plusieurs de l'un ou l'autre type d'adresse sont présents, vous pouvez choisir de sortir la première ou autant que vous pouvez accéder. Tant qu’au moins un local et un public sont présents.

MysticVagabond
la source
3
Je pense que la 0/1chose ajoute des peluches inutiles au défi.
M. Xcoder
5
Ceci est sous-spécifié. En particulier, il ne traite pas clairement les cas où il existe plusieurs adresses IP locales et / ou plusieurs adresses IP publiques. De plus, il n'y a aucun moyen fiable de savoir si j'ai plusieurs adresses IP publiques et, dans l'affirmative, quelles sont-elles.
Peter Taylor
5
Que faire si l'hôte n'a pas d'adresse RFC 1918? Il semble qu'il n'y ait pas de réponse fiable à cela, sauf sur les machines qui ont au moins un réseau privé.
Toby Speight
4
... et même une interface réseau peut avoir plusieurs adresses IP.
Kaz
14
En fait, je ne vois pas comment vous pourriez résoudre la moitié de ce problème sans chercher à partir d'une source externe , ce qui est l'une des failles standard que vous avez expressément interdites.
Octopus

Réponses:

18

Bash + curl + iproute2 , 54 50 49 48 33 octets

ip r g 1|awk '$0=$7'
curl eth0.me

Merci @DomHastings d'avoir joué au golf sur 1 octet!

Merci @Sisyphus d'avoir trouvé une URL plus courte!

Merci @zeppelin d'avoir joué au golf sur 9 octets!

ბიმო
la source
@DomHastings Vos dernières tentatives de golf retournent des déchets avec l'adresse IP, au moins sur Ubuntu 16.04.3 LTS
Ferrybig
@Ferrybig Ouais, la 1/0partie renvoie une erreur à STDERR, mais cela est ignoré par défaut, si vous obtenez une sortie différente pour ip routecela, cela pourrait simplement être la version que j'utilisais sur ma machine. La honte!
Dom Hastings du
La première ligne s'imprime 1000pour moi ... ip route get 1sortie: ptpb.pw/pixx
Majora320
Lorsque RTNETLINK answers: Network is unreachable
j'exécute
1
Vous pouvez également optimiser un peu votre expression AWK:awk 'NR<2&&$0=$7'
zeppelin
9

Bash 37 31 27 octets

Ceci est inspiré par la réponse de Bruce Forte . Cette réponse ne fonctionne qu'avec IPv4, ce qui signifie que cela ne fonctionne pas pour moi. Je l'ai réécrit dans une version qui (uniquement) fonctionne avec IPv6:

ip r g b::|awk '$0=$9" "$9'

Ceci est testé sur Ubuntu 14.04.5 connecté via PPPoE et puisque IPv6 est conçu pour être utilisé sans aucun NAT, il affichera deux fois la même adresse IP.

-6 octets grâce à zeppelin , -2 octets grâce à Ferrybig , -2 octets grâce à Markasoftware .

kasperd
la source
Sur mon Ubuntu 16.04.3 LTS, j'ai dû changer '{print$11,$11}'pour '{print$9,$9}'faire fonctionner la commande, votre commande est retournée 1024 2 fois, votre commande fonctionne sur ma machine Ubuntu 16.04.2
Ferrybig
@Ferrybig dépend alors probablement de la configuration du réseau. J'ai testé cela sur un réseau où les adresses sont configurées automatiquement à partir des publicités du routeur.
kasperd
Pour les machines où l'adresse IP est configurée manuellement (statique), ip routene produit pas la proto rapièce, vous pouvez l'utiliser comme une fonctionnalité pour approfondir votre réponse
Ferrybig
@Ferrybig En ce moment, je me demande si je peux trouver un moyen de le faire fonctionner dans les deux cas sans que la taille explose. Btw. sur ma machine 16.04.3 qui a reçu sa configuration à l'aide de publicités de routeur, elle dit que proto staticnon proto ra, bien que cette différence n'ait pas d'importance pour ce code.
kasperd
Pour jouer un peu au golf, utilisez awk '$0=$9" "$9'plutôt {print$11,$11}. De nombreux systèmes (y compris mon Arch) utilisent le 9ème mot, il est donc plus court que 11, et l'utilisation de cette syntaxe est également plus petite que print $ 9, $ 9
markasoftware
7

Mathematica, 17 octets

Mathematica a une fonction intégrée pour tout

$MachineAddresses

Comme décrit dans la documentation , cette commande intégrée répertorie toutes les adresses IP (locales et externes) associées à votre appareil.

JungHwan Min
la source
La documentation ne dit rien sur les adresses externes.
kasperd
Si cette commande répertorie également l'adresse ipv6, vous pouvez dire que l'adresse ipv6 est le résultat attendu
Ferrybig
5
Cela produit une liste de plusieurs adresses IP pour moi, mais aucune ne semble être mon adresse externe; Je n'interprète peut-être pas les choses correctement, cependant. Je peux obtenir mon adresse IP externe à partir de quelque chose comme, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]mais je ne sais pas comment y accéder plus directement.
Mark S.19
@Des notes. C'est étrange; J'obtiens mon adresse IP externe lorsque j'exécute la commande (la dernière entrée semble être celle-ci). Cependant, cette commande ne fonctionnera pas sur Wolfram Sandbox. C'est peut-être un bug; quelle version d'OS et de Mathematica utilisez-vous?
JungHwan Min
@JungHwanMin 11.1.1.0 Student Edition me donne 6 choses que je suppose être IPv6, puis 192.168.0.104 et trois adresses commençant par 169.254. Mais mon adresse externe commence par 69.
Mark S.
6

AutoIt, 56 53 octets

#include<Inet.au3>
ConsoleWrite(@IPAddress1&_GetIP())

@IPAddress1 est une macro qui revient

Adresse IP de la première carte réseau

_GetIP() résultats

l'adresse IP publique.


-3 octets grâce à @ mınxomaτ

Daniel
la source
3
Neat, un collègue AutoIt (pas IT) -er. Vous pouvez supprimer les espaces de ce code.
mınxomaτ
@ mınxomaτ Merci pour la correction :)
Daniel
6

C #, 196 194 188 163 163 octets

namespace System.Net.Sockets{using Linq;_=>Dns.GetHostEntry("").AddressList.First(i=>(int)i.AddressFamily==2)+" "+new WebClient().DownloadString("http://eth0.me")}

Enregistré 2 octets grâce à @Xynos.
25 octets enregistrés grâce à @Nick.

Version complète / formatée:

namespace System.Net.Sockets
{
    using Linq;

    class P
    {
        static void Main()
        {
            Func<object, string> f = _ =>
                Dns.GetHostEntry(Dns.GetHostName())
                    .AddressList
                    .First(i => (int)i.AddressFamily == 2) + " " + new WebClient().DownloadString("http://eth0.me");

            Console.WriteLine(f(null));

            Console.ReadLine();
        }
    }
}
TheLethalCoder
la source
ne pouvez-vous pas économiser deux octets en supprimant les espaces autour du ==?
MysticVagabond
@Xynos Bien sûr, je ne savais pas que je ne l'avais pas supprimé.
TheLethalCoder
La version golfée ne compile pas et n'est pas une fonction autonome. Il ne semble pas juste de mélanger une fonction autonome avec le raccourci d'utilisation de l'espace de noms Sockets, donc je suggère de choisir une option et de l'accompagner. Cela dit, vous pouvez enregistrer quelques octets en convertissant en i.AddressFamilyau intlieu de transtyper 2en AddressFamily, et vous pouvez remplacer Dns.GetHostName()par la chaîne vide.
Nick
@ Nick je vais essayer ça quand j'aurai une chance et l' namespaceastuce est assez courante pour C #. Si vous pensez que cela ne devrait pas être autorisé, vous pouvez publier sur méta à ce sujet, mais pour le moment c'est un jeu équitable et une astuce pour raccourcir le usings.
TheLethalCoder
6

PowerShell v4 +, 40 36 octets

NetIPAddress|% IPA*
iwr eth0.me|% C*

(Fonctionne uniquement sur Server 2012 R2 ou supérieur, ou Windows 8.1 ou supérieur. Ne fonctionne pas sur TIO.)

Est-ce exactement ce qu'il dit sur l'étain. Obtient les adresses IP du réseau local et sélectionne uniquement la IPApartie de celle-ci (par exemple, filtre le masque de sous-réseau, la passerelle, etc.).

Le second est un Invoke-WebRequestàhttp://eth0.me qui obtient simplement son Ccontenu; c'est-à-dire, juste l'adresse IP publique.


Version non golfée:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
la source
Un utilisateur anonyme suggère de supprimerGet-
Stephen
@StepHen Effectivement. Fonctionne très bien.
AdmBorkBork
4

Unix Shell + stunclient , 40 octets

stunclient stun.vo.lu|cut -d: -f2|sed 1d

Utilise un protocole STUN :

Session Traversal Utilities for NAT (STUN) est un protocole qui sert d'outil à d'autres protocoles pour gérer la traversée du Network Address Translator (NAT). Il peut être utilisé par un point de terminaison pour déterminer l'adresse IP et le port qui lui sont attribués par un NAT

Le nom du serveur STUN provient de la liste des serveurs STUN publics .

Le format de sortie est:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Notez que les deux lignes seront en retrait avec un seul espace, mais je pense que cela ne casse pas les règles de sortie telles qu'elles sont écrites.

Exemple de sortie:

  192.168.1.100    
  209.85.233.147
Zeppelin
la source
4

curl (bash one-liner): 27 octets

curl -w%{local_ip} eth0.me

Le résultat est imprimé stdoutet ressemble à ceci:

1.2.3.4
192.168.0.10
# no trailing newline, use "curl -w%{local_ip}\\n eth0.me" for it

curl devrait être au moins de la version 7.29.0 (à partir du 6 février 2013).

La réponse est basée sur /codegolf//a/139538/66016 .

Kirill Bulygin
la source
4

Go, MacOS uniquement, 10 octets

Dans macOS, ce killswitch pourrait être utilisé, il peut imprimer l'IP active privée actuelle et l'IP publique:

$ killswitch 
Interface  MAC address         IP
en1        bc:34:36:d2:81:ba   192.168.2.10

Public IP address: 179.43.176.99

No VPN interface found, verify VPN is connected

Ce n'est pas un outil intégré mais essaie de simplifier le processus de recherche des IP appropriées.

La sortie pourrait être obtenue en utilisant des commandes comme:

$ route get 0.0.0.0

$ ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

$ networksetup -listnetworkserviceorder

$ scutil --dns

IP publique:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short
nbari
la source
2
Salut! Bienvenue chez PPCG! Cette question est étiquetée code-golf . Pourriez-vous fournir un code de golf avec une langue et un nombre d'octets?
Stephen
3

PowerShell v3 + (réponse alternative pour Windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
la source
2
Bienvenue chez PPCG!
Stephen
1
Vous pouvez supprimer les espaces environnants -matchpour enregistrer quelques octets.
AdmBorkBork
3

Bash + Awk + Curl, 43 octets

utilisant uniquement des outils intégrés pour Mac et Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Alex Nikiforov
la source
1
* bash tu veux dire.
Suici Doga
bash + awk + curl
Alex Nikiforov
j'ai édité la question pour dire bash car cela fonctionne sur mon ordinateur portable linux et pas seulement sur macos
Suici Doga
thx, je me suis amélioré car bash est un shell en soi (devrait fonctionner sur tcsh, sh et tout autre shell), vous devez également avoir ifconfig, awk et curl
Alex Nikiforov
1
Ce n'est pas "MacOS / Linux", c'est Bash. Il suffit de le marquer comme tel.
LyricLy
2

Python 3, 124 133 octets

from urllib2 import urlopen
import socket
a=urlopen('http://eth0.me').read()
b=socket.gethostbyname(socket.gethostname())
print a,b
Teo
la source
N'en avez-vous pas également besoin print a,b? Fait intéressant, cela génère deux adresses IP sur mon système (Win7), mais aucune d'entre elles n'est mon adresse IP locale réelle. best en fait l'IP d'un adaptateur virtuel et non ma connexion au réseau local .
Octopus
On peut dire que c'est toujours une adresse IP locale . J'ai laissé un commentaire sur la question pour demander des éclaircissements à ce sujet.
Octopus
@Octopus vous avez raison d'imprimer, mis à jour
Teo
Dans une modification suggérée, @David a suggéré ceci: 113 octets (voir ici )
Stephen
2

Node.js (JavaScript) 224 223 194 175 173 130 130 octets

r=require,l=console.log,r('dns').lookup(r('os').hostname(),(a,b)=>l(b));r('http').get('http://eth0.me',a=>a.on('data',c=>l(c+"")))

Version non golfée:

require('dns').lookup(require('os').hostname(), (err, loc, fam) => console.log(loc));
require('http').get('http://eth0.me', res => {
    res.on('data', chunk => console.log(chunk + ""));
});

  • 1 octet enregistré (en raison d'un point-virgule inutile).
  • 29 octets enregistrés grâce à @AndrewLi (fonctions de flèche utilisées pour le code plus court).
  • 19 octets enregistrés grâce à @MiniGod (utilisé .get()au lieu de .request()- .end();supprimé).
  • Sauvegardé 2 octets grâce à @ Zacharý (les parenthèses ne sont pas nécessaires autour d'un seul paramètre d'une fonction flèche).
  • Sauvegardé 43 octets grâce à @Birjolaxew (stocké requireet console.logdans des variables à lettre unique, transmis directement l'URL à require('http').get, sortie enregistrée directement à partir de l' dataévénement).

la source
Ne pouvez-vous pas utiliser les fonctions fléchées pour un code plus court?
Andrew Li
@AndrewLi Excellente suggestion, merci. :)
Vous pouvez utiliser à la .get()place de .request(). Ensuite, vous n'avez pas non plus besoin de .end();.
MiniGod
1
Vous n'avez pas besoin de parens autour d'un paramètre isolé d'une fonction de flèche. ( (a)=>=> a=>), IIRC.
Zacharý
1
@AndrewLi Hmm, le problème est que lorsque le code est exécuté dans le REPL, il affiche des informations supplémentaires (par exemple les informations de demande), ce qui est interdit dans la question. Je pourrais ajouter du code supplémentaire pour masquer cette sortie, mais cela pourrait contrebalancer la réduction d'octets résultant de l'omission des requireappels, donc je vais le laisser pour l'instant. Merci quand même pour la suggestion.
1

Fichier batch de Windows , 116 octets

@for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "v4"')do @echo%%b
@powershell -Command "(iwr eth0.me).content"

La première ligne parcourt les résultats de l'exécution ipconfig et obtient votre adresse IPv4 locale.

Pour la partie IP publique, j'ai dû voler un peu de la merveilleuse réponse Powershell car, à ma connaissance, il n'y a aucun moyen d'obtenir l'IP publique de la machine en utilisant uniquement des scripts batch.

Nous commençons par un @signe, pour supprimer l'écho de l'invite ( C:\...\path>), puis exécutons la commande Powershell Invoke-WebRequest(avec son alias,iwr ) et extrayons la contentpartie de cela.

J'ai expérimenté non utiliser(...).content et, au lieu de cela, d'exécuter uniquement la commande et d'extraire les informations réelles de la sortie complète, en utilisant un lot. Mais cela s'est avéré bien plus long que cette solution, alors je l'ai gardée.

Testé sur Windows 10.0.15063.

Matheus Avellar
la source
1

R, 142 , 140 , 137 octets

library(magrittr);system("ipconfig",int=T)%>%regmatches(.,regexpr("v4.+",.))%>%{a=nchar(.);substr(.,a-14,a)};readLines("http://eth0.me")

Testé sur win10 et R (3.4.1).
Merci pour @ Bruce-Forte pour l'URL courte.

Version non golfée:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
la source
Jusqu'à 120 octets Essayez-le en ligne!
BLT
@BLT nice solution. Vous pouvez économiser 3 octets, en remplaçant a <- nchar(x)para=nchar(x)
AndriusZ
@AndruisZ merci, mais c'est vraiment votre solution - je viens de la désagréger.
BLT
1

Python 2.7.13 128 octets

print __import__("urllib").urlopen("http://eth0.me").read(),__import__("socket").gethostbyname(__import__("socket").getfqdn())
Alexander Baine
la source
1

Bash + Curl, 24 octets

hostname -i;curl eth0.me
Probablement
la source
Cela ne fonctionne pas. À partir de la page de manuel: " Cette option énumère toutes les adresses configurées sur toutes les interfaces réseau. [...] Ne faites aucune hypothèse sur l'ordre de la sortie."
ბიმო
Est-ce que -I (majuscule) n'a pas une utilisation différente de -i (minuscule). Le morceau que vous avez cité provient de la section -I .
Probablement
C'est vrai, désolé pour ça. Mais pire encore, il est dit " Évitez d'utiliser cette option ", de toute façon cela ne fonctionne pas (au moins sur mes machines) ..
ბიმო
Bon, certes, je n'ai pas lu la documentation complète avant de poster. Curieusement, il semble fonctionner correctement sur quelques-unes de mes machines. Mais cette incohérence rendrait cette solution peu fiable au mieux.
Probablement
1

MS-SQL, 59 octets

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Renvoie l'adresse IP côté client de l'instance SQL exécutant la requête.

BradC
la source
0

VBA, 58 octets

Oups, ne gère pas l'adresse locale - correction en cours

Remarque: utilise une référence à

Microsoft Internet Controls

Fonction de fenêtre immédiate VBE anonyme qui ne prend aucune entrée et génère l'adresse IP de l'utilisateur via une fenêtre Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Taylor Scott
la source