Is there a bash command to find the IP address for an Ubuntu box? I need to find the IP address so I can ssh into the machine later.


18 Answers 18


/sbin/ifconfig -a


You can use:

/bin/ip addr
  • 3
    @opierce You have marked mpbloch's answer as correct, but as an FYI, you should be using this answer, as this is part of the iproute2 suite. ifconfig is being phased now.
    – Baldrick
    Commented Jun 19, 2013 at 15:03
  • 4
    You can make that shorter by just running ip a.
    – gak
    Commented Dec 31, 2013 at 20:42

If you have an internal address in use, checking

curl http://myip.dnsomatic.com

might be a good idea on unix shells.
Or, just plonk that URL into your browser.

If you get a different answer from the "ifconfig -a" result,
the ifconfig gave your internal address -- which will probably not work from outside.

Even if all seems fine, you could have a firewall in place that will disallow incoming ssh connections.
At which time you should try the port of interest from a browser on the machine at,


That will confirm connectivity through,

  • external IP address (showing it to you on that page)
  • NAT, Port Forwards
  • Firewalls
  • True, but if that is the case, there are probably no NAT/Port Forwarding rules in place to match ssh to whatever the internal IP is. Commented Jul 27, 2009 at 18:25
  • @Kyle, Which can be added...
    – nik
    Commented Jul 27, 2009 at 18:30
  • 3
    +1 for curl http://myip.dnsomatic.com
    – JatSing
    Commented Feb 16, 2012 at 2:46
  • Similar to this, there is also curl ifconfig.me
    – Baldrick
    Commented Jun 19, 2013 at 15:04

/bin/hostname -i

  • 3
    In this case I would suggest using hostname --all-ip-addresses. Display all network addresses of the host. This option enumerates all configured addresses on all network interfaces. The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.
    – lrkwz
    Commented Jan 24, 2014 at 11:36
  • 5
    Shorter alternative to @lrkwz's comment /bin/hostname -I
    – hanxue
    Commented Apr 9, 2014 at 8:58
  • Thanks @hanxue - this ought to be an answer of it's own - the shortest command with the cleanest output - just what I was looking for! In my experience (Ubuntu), /bin/hostname -i just gives, which is useless. Commented Jun 27, 2017 at 14:50
  • This is the correct answer
    – servers
    Commented Feb 8, 2023 at 22:11
 curl icanhazip.com

tee hee!

From http://www.commandlinefu.com/commands/view/2966/return-external-ip

/sbin/ifconfig|grep inet|head -1|sed 's/\:/ /'|awk '{print $3}'

If you need your internal adress append your interface after ifconfig, e.g.

 /sbin/ifconfig eth0|grep inet|head -1|sed 's/\:/ /'|awk '{print $3}'
  • +1, this is exactly what I needed to solve a problem. Hurray for one-liners!
    – J. Polfer
    Commented Feb 26, 2010 at 18:53
  • +1 Without the head -1: /sbin/ifconfig|grep inet|sed 's/\:/ /'|awk 'NR==1 {print $3}'
    – joeslice
    Commented Jul 7, 2010 at 15:40
  • Thanks, it works on Debian but on OS X it doesn't work, returning some garbage. It would be great if we could come of with a line that works on both. Here is the output of ifconfig on OS X: gist.github.com/ssbarnea/5814657
    – sorin
    Commented Jun 19, 2013 at 14:16

If you are behind a NAT, and need the public IP, use this:

wget -q -O - checkip.dyndns.org|sed -e 's/.Current IP Address: //' -e 's/<.$//'

taken from: http://www.go2linux.org/what-is-my-public-ip-address-with-linux


If you have multiple interfaces, could be useful to specify which one you want IP. if you want IPV4 address of interface 'eth0':

ip addr show dev eth0 | grep "inet " | awk '{ print $2 }' 

if you want IPV6 address of interface 'eth0':

ip addr show dev eth0 | grep "inet6 " | awk '{ print $2 }' 

if you want to search for an IP between two common interfaces of a laptop, wlan0 and eth0:

for INTERFACE in wlan0 eth0; do
    if [ -z $CURRENT_IP ]; then
        CURRENT_IP=$(ip addr show dev $INTERFACE | grep "inet " | awk '{ print $2 }')

If you need to find out what the IP address of your router, you could run this command.

dig +short myip.opendns.com @ @

If you are using OpenDNS for your dns server, you could shorten it to:

dig +short myip.opendns.com

You could also use this command.

curl http://myip.dnsomatic.com

Just curl this page:

$ curl wtfismyip.com/text

  • And how exactly is this superior to the similar services already mentioned during these years? Commented Mar 29, 2015 at 20:24

Here is a one line that works on Linux and OS X too, and it will return the first address that is not local:

ifconfig | sed -En 's/;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

Send credits to https://stackoverflow.com/a/13322549/99834

LOCAL_IP=`/bin/hostname -I | sed 's/ //g'`

The simplest way to go about it is probably

ifconfig eth0

assuming the machine has a single IP address on the default wired interface - you might need

ifconfig wlan0

if it's on WiFi.

ip address show scope link

It will show you the IP address of living - has link - interfaces. But it is not a bash command. Bash has no ability to know about IP and network at all.


What I understand is you want to connect a remote ubuntu machine which has dynamic ip. Go dyndns.org site and open a free account. Then on the remote machine you need to install a dynamic ip tool.

sudo aptitude install dyndns-client

so you can ssh remote machine via

ssh [email protected]

So after configuration you will never need the remote machine ip address.

  • This is my preferred method for dealing with dynamic IPs. dyndns.org is a fantastic, free service. Commented Aug 12, 2009 at 8:40

Here is what I am using:

LC_ALL=C /sbin/ifconfig | awk '
    /inet addr/ {
        if(($2!="") && ($2!="") && ($2!=""))
            { print $2 };

if you need just a single IP of given interface you can do:

ifconfig eth0 | grep "inet " | awk '{gsub("addr:","",$2);  print $2 }' 

If you're looking for a public IP address of the box, you could use the following:

  • dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"

You could use dig(1) options like -4 or -6 to specifically look for an IPv4 or IPv6 address; Google will provide an answer in a record of TXT type, which will have quotes around it when presented by dig; if you want to subsequently use the variable with utilities like traceroute, you gotta use something like tr(1) to remove said quotes.

Other options include whoami.akamai.net and myip.opendns.com, which answer with A and AAAA records (instead of TXT as in the above example from Google), so, they don't require having the quotes removed:

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

  • dig -4 @resolver1.opendns.com -t any myip.opendns.com +short

  • dig -6 @resolver1.opendns.com -t any myip.opendns.com +short

Here's a sample script that uses all the options above to set the variables:

IPANY="$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv4="$(dig -4 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv6="$(dig -6 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
AKAMv4="$(dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short)"
CSCOv4="$(dig -4 @resolver1.opendns.com -t a myip.opendns.com +short)"
CSCOv6="$(dig -6 @resolver1.opendns.com -t aaaa myip.opendns.com +short)"
printf '$GOOG:\t%s\t%s\t%s\n' "${IPANY}" "${GOOGv4}" "${GOOGv6}"
printf '$AKAM:\t%s\n$CSCO:\t%s\t%s\n' "${AKAMv4}" "${CSCOv4}" "${CSCOv6}"

If you're looking for a private IP address, or for a set of all IP addresses assigned to the box, you could use some combination of ifconfig (on BSD and GNU/Linux), ip addr (on GNU/Linux), hostname (options -i and -I on GNU/Linux) and netstat to see what's going on.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .