web-dev-qa-db-fra.com

Recherche de l'adresse IP publique dans un script Shell

Je peux trouver mon adresse IP en utilisant la commande ifconfig ou hostname -i.

Mais comment trouver mon IP publique?

(J'ai une IP publique statique mais je veux le découvrir en utilisant la commande unix)

40
shantanuo

curl ifconfig.me

curl ifconfig.me/ip (pour juste l'ip)

curl ifconfig.me/all (pour plus d'informations, prend du temps)

Pour plus de commandes, visitez: http://ifconfig.me/#cli_wrap

49
tsanand129

Vous pouvez demander myip.opendns.com. depuis OpenDNS. Dig @208.67.222.220 myip.opendns.com

26
Zoredache

Dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

Dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

Dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


Notez que ce qui précède ne fonctionne que pour IPv4 actuellement (aucun de ces résolveurs ne semble même avoir IPv6 actuellement, mais si vous omettez -4 et l'explicite -t a, alors vous risquez qu'il tombe en panne à l'avenir (à l'exception de txt de Google, qui pourrait réellement fonctionner pour IPv6 un jour, s'il est correctement activé par Google)).

Notez que myip.opendns.com ne peut être résolu que par resolver1.opendns.com, et non avec auth1.opendns.com - donc, ils semblent faire un détournement de DNS et un homme au milieu de leur propre nom de domaine! Ainsi, vous ne pouvez pas l'utiliser pour trouver l'IP d'un résolveur aléatoire, car resolver1.opendns.com ne fait pas autorité pour myip.opendns.com.

Notez que o-o.myaddr.l.google.com ressemble à l'approche la plus flexible et la plus évolutive; il est même bon pour tester si votre résolveur DNS prend en charge l'extension expérimentale EDNS0 pour le sous-réseau client (que très peu de résolveurs prennent en charge):

% Dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114
18
cnst

Une réponse très simple si vous avez accès à Internet est:

curl icanhazip.com

Gardez à l'esprit que faire confiance à des sources tierces pour votre adresse IP peut être problématique, surtout si ce que vous faites avec ces données a une signification particulière.

Un moyen plus fiable consiste à choisir un serveur DNS connu et fiable (exécutant idéalement DNSSEC) et à interroger le nom d'hôte de la boîte avec lui, à condition que votre serveur DNS contienne de telles entrées;

Dig @trustworthysource.com +short `hostname`
12
Matthew Ife

J'ai écrit un service web simple et rapide pour cela.

curl ident.me

Vous pouvez demander votre IPv4:

curl v4.ident.me

Ou IPv6:

curl v6.ident.me

Et l'API est documentée sur http://api.ident.me/

8
Pierre Carrier
7
Michael Todd

Si

  1. vous n'avez qu'une une adresse IP publique et
  2. vous êtes directement connecté à Internet (non NAT/proxy/VPN etc.)

alors vous pouvez simplement analyser la sortie de ifconfig pour les adresses IP des interfaces (la partie "inet addr:") pour obtenir la liste des adresses IP de toutes vos interfaces. La seule adresse IP qui n'est pas dans la plage privée (voir http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) est votre adresse IP publique.

La même liste peut également être obtenue via

ip addr show

qui peut être plus facile à analyser.

Si vous n'avez pas de connexion Internet directe (NAT, etc.), il n'y a aucun moyen de trouver votre adresse IP publique sans aide externe (car votre ordinateur ne la connaît pas). Ensuite, vous devrez le faire comme dans les autres réponses.

5
sleske

J'ai adopté une approche un peu différente en utilisant le protocole STUN qui a été conçu pour NAT Traversal. Si vous utilisez Ubuntu, vous pouvez simplement installer le paquet "stun" en tapant:

Sudo apt-get install stun

Le package installe un serveur STUN dont vous n'aurez probablement pas besoin, mais il est également livré avec un client de test STUN que j'ai utilisé pour résoudre ce problème. Vous pouvez maintenant récupérer votre adresse IP publique avec une commande (pas si simple):

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

Maintenant, ce qu'il fait est: stun contacte le serveur STUN public "stunserver.org" et obtient une réponse avec votre IP publique, le reste de la commande consiste simplement à filtrer l'IP de la sortie.

4
Romed

Vous pouvez notamment faire une demande sur la page à l'adresse

http://www.biranchi.com/ip.php

il renvoie l'adresse IP de votre système

3
Biranchi

Google affiche désormais votre adresse IP publique: http://www.google.com/search?q=ip

3
Jake Wilson

D'accord ... Je sais que c'est bien après coup et probablement même pas la peine d'être publié, mais voici ma solution de travail.

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

Agréable et simple.

3
Skittles

La manière la plus simple est d'utiliser http://ifconfig.me/ , comme suggéré.

Sur cette page, vous saurez quelle commande utiliser pour les informations que vous souhaitez récupérer.

Pour IP:

curl ifconfig.me
curl ifconfig.me/ip

Pour le nom d'hôte public:

curl ifconfig.me/Host

Pour toutes les informations dans un fichier XML:

curl ifconfig.me/all.xml

etc ... il suffit de vérifier http://ifconfig.me

3
Kelindil

Pour éviter de compter sur des sources externes, j'utilise expect, pour telnet dans mon routeur et obtenir l'adresse IP de son interface publique. Voici un exemple de script d'attente:

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

J'exécute ensuite le script ci-dessus comme ceci pour obtenir l'ip publique:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

Bien sûr, cela est basé sur l'hypothèse que j'ai un accès administrateur au routeur et à son routeur basé sur Linux, avec la commande ifconfig disponible.

2
Hammad Akhwand

Je fais beaucoup cela et à partir de nombreux appareils, j'ai donc créé mes propres services sur un serveur:

  1. fichier php à la racine d'un serveur web:

    user@Host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    Utilisation sur un shell:

    $ curl -4 mydomain.com
    79.22.192.12
    

    fonctionne également avec ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    Avec netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    Sur un routeur Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. piratage rapide avec un serveur telnet personnalisé: xinetd spawning/usr/bin/env:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    puis telnet:

    $ nc -4 myserver.com 23
    REMOTE_Host=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_Host=2a01:e34:ee7d:180::3
    

    fonctionne de la même manière avec un routeur:

    router#telnet myserver.com
    79.22.192.12
    

De cette façon, vous pouvez le faire fonctionner sur votre réseau interne, si un nat ou un proxy est impliqué dans la communication et que vous souhaitez savoir à partir de quelle IP vous apparaissez.

Il ne nécessite aucun service tiers.

2
petrus

Si vous voulez trouver l'adresse IP externe sur votre routeur, vous pouvez soit demander au routeur lui-même son adresse WAN, soit demander à quelqu'un de l'extérieur de vous l'obtenir.

pour une manière manuelle, vous pouvez parcourir l'un des sites ci-dessus qui renverra l'ip de la demande entrante.

Pour une manière automatisée, vous pouvez essayer:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

qui vous obtiendra la ligne qui contient l'adresse IP sur la réponse http, puis l'analyser avec sed, awk, etc.

1
AlexFerrer
1
bortzmeyer

Une solution de script Shell simple peut être trouvée ici:

http://bash.cyberciti.biz/misc-Shell/read-local-ip-address/

Fonctionne sur Linux, FreeBSD, SunOS et Apple Darwin (avec une modification mineure).

1
Stefan Lasiewski

vous pouvez utiliser uniquement le Shell pour vérifier votre adresse IP externe, en utilisant également des fournisseurs externes

#!/bin/bash
TCP_Host="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_Host}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_Host}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

production

0
levislevis85

Je fais ça. Cela me donne juste l'IP sans aucune implication de tiers ..

iP addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"

0
Leigh Geary

Voici une autre alternative qui dépend des hôtes dont les affaires résolvent la gestion de l'IP dynamique plutôt que des sites "de service public" qui peuvent disparaître ou changer de format.

1) Enregistrez votre serveur sur l'un des nombreux services DNS dynamiques gratuits (par exemple no-ip.com) Cela vous donnera une entrée DNS comme xxx.no-ip.org.

2) Installez l'outil de mise à jour dynamique du service (signale les modifications IP au service).

Pour obtenir l'adresse IP dans un script, faites simplement:

$external_ip = `Dig +short xxx.no-ip.org`

Idéal pour une utilisation dans le travail cron pour vérifier si l'IP dynamique a changé et certaines entrées de configuration doivent être modifiées.

0
cgmonroe
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *' 
 - m1 
0
user58157
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
0
Fathi

Sur OS X, voici deux solutions simples pour obtenir à la fois l'adresse IP privée et publique (avec un code bonus si vous utilisez LaunchBar).

IP privée

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

LaunchBar Script

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

IP publique

$ Dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

LaunchBar Script

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(Dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
0
user252912