GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir l'adresse IP externe dans un script shell ?

J'ai besoin de trouver mon adresse IP externe à partir d'un script shell. Pour le moment j'utilise cette fonction :

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Mais cela dépend de perl-libwww , perl-html-format , perl-html-tree installée. De quelles autres manières puis-je obtenir mon adresse IP externe ?

Réponse acceptée :

Je vous recommande de l'obtenir directement à partir d'un serveur DNS.

La plupart des autres réponses ci-dessous impliquent toutes de passer par HTTP vers un serveur distant. Certains d'entre eux nécessitaient une analyse de la sortie ou s'appuyaient sur l'en-tête User-Agent pour que le serveur réponde en texte brut. Ceux-ci changent assez fréquemment (descendent, changent de nom, publient des annonces, peuvent changer de format de sortie, etc.).

  1. Le protocole de réponse DNS est standardisé (le format restera compatible).
  2. Historiquement, les services DNS (Akamai, Google Public DNS, OpenDNS, ..) ont tendance à survivre beaucoup plus longtemps et sont plus stables, plus évolutifs et généralement plus prisés que n'importe quel nouveau service HTTP whatismyip dot-com branché. aujourd'hui.
  3. Cette méthode est intrinsèquement plus rapide (ne serait-ce que de quelques millisecondes !).

Utiliser dig avec un résolveur OpenDNS :

$ dig @resolver4.opendns.com myip.opendns.com +short

Peut-être l'alias dans votre bashrc donc c'est facile à retenir

# https://unix.stackexchange.com/a/81699/37512
alias wanip='dig @resolver4.opendns.com myip.opendns.com +short' 
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
alias wanip6='dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6'

Répond avec une adresse IP simple :

$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111

Syntaxe

(Abrégé de https://ss64.com/bash/dig.html) :

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

Le ANY Le type de requête renvoie un enregistrement AAAA ou A. Pour préférer spécifiquement la connexion IPv4 ou IPv6, utilisez le -4 ou -6 options en conséquence.

Pour exiger que la réponse soit une adresse IPv4, remplacez TOUT par A; pour IPv6, remplacez-le par AAAA . Notez qu'il ne peut renvoyer que l'adresse utilisée pour la connexion. Par exemple, lors d'une connexion via IPv6, il ne peut pas renvoyer l'adresse A.

Serveurs alternatifs

Divers fournisseurs DNS proposent ce service, notamment OpenDNS, Akamai et Google Public DNS :

# OpenDNS (since 2009)
$ dig @resolver3.opendns.com myip.opendns.com +short
$ dig @resolver4.opendns.com myip.opendns.com +short
80.100.192.168

# OpenDNS IPv6
$ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6
2606:4700:4700::1111

# Akamai (since 2009)
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

# Akamai approximate
# NOTE: This returns only an approximate IP from your block,
# but has the benefit of working with private DNS proxies.
$ dig +short TXT whoami.ds.akahelp.net
"ip" "80.100.192.160"

# Google (since 2010)
# Supports IPv6 + IPv4, use -4 or -6 to force one.
$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Exemple d'alias qui demande spécifiquement une adresse IPv4 :

# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Et pour votre adresse IPv6 :

# https://unix.stackexchange.com/a/81699/37512
alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6'

$ wanip6
"2606:4700:4700::1111"

Dépannage

Si la commande ne fonctionne pas pour une raison quelconque, il peut y avoir un problème de réseau. Essayez d'abord l'une des alternatives ci-dessus.

Connexe :Vous essayez de récupérer des données à partir d'un lecteur RAID externe ?

Si vous soupçonnez un problème différent (avec le fournisseur en amont, l'outil de ligne de commande ou autre chose), exécutez la commande sans le +short option pour révéler les détails de la requête DNS. Par exemple :

$ dig @resolver4.opendns.com myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  A

;; ANSWER SECTION:
myip.opendns.com.   0   IN  A   80.100.192.168

;; Query time: 4 msec

Linux
  1. Comment chiffrer ou rendre le script shell illisible ?

  2. Comment obtenir des descriptions des options `shopt` disponibles ?

  3. Comment lire l'intégralité du script Shell avant de l'exécuter ?

  4. Comment obtenir le PYTHONPATH en shell?

  5. Comment obtenir le PID d'un processus enfant forké dans un script shell

Comment utiliser des variables dans les scripts Shell

Comment obtenir votre adresse IP sous Linux

Comment exécuter une commande dans un script shell ?

Obtenir l'adresse MAC à l'aide du script shell

Comment exécuter du code dans le shell Django par un script python externe ?

Comment puis-je obtenir mon adresse IP externe dans un script shell ?