I need to find my external ip address from a shell script At the moment I use this function:

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

But it depends on perl-libwww , perl-html-format , perl-html-tree installed. How do i get my ip through my external network?

Best Answer

I'd recommend you get it directly from the dns server

The other answers below involve going through http to a remote server Some required parsing of the output or relied on the user agent header to make the server respond in plain text Those change quite frequently (go down, change their name, put up ads, might change output format etc. ).

  1. The protocol for dns response is standardised the format will be compatible
  2. Historically, DNS services (Akamai, Google Public DNS, OpenDNS, ..) tend to survive much longer and are more stable, more scalable, and generally more looked-after than whatever new hip whatismyip dot-com HTTP service is hot today.
  3. This method is inherently faster so it is only a few milliseconds ).

Using dig with an OpenDNS resolver.

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

Perhaps alias it in your bashrc so it's easy to remember

# 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'

Responds with a plain ip address

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


(Abbreviated from 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)

The ANY query type returns either an AAAA or an A record. To prefer IPv4 or IPv6 connection specifically, use the -4 or -6 options accordingly.

To require the response be an IPv4 address, replace ANY with A ; for IPv6, replace it with AAAA . Remember that it can only return the address of the connection For example, when connecting over ipv6, it cannot return the a address.

Alternative servers

Various DNS providers offer this service, including OpenDNS , Akamai , and Google Public DNS .

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

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

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

# 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" ""

# 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

Example alias that specifically requests an ipv4 address.

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

$ wanip4

And for your ipv6 address.

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

$ wanip6


If the command is not working for some reason there may be a network problem Try one of the alternatives mentioned earlier

If you suspect a different issue (with the upstream provider, the command-line tool, or something else) then run the command without the +short option to reveal the details of the DNS query. For example.

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

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

;myip.opendns.com.      IN  A

myip.opendns.com.   0   IN  A

;; Query time: 4 msec