13

How can I assign the IP address of eth0 to an environment variable, say $ip, as easily as possible?

Update: Distro is Ubuntu Server 12.04 LTS.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
user204863
  • 131
  • 1
  • 1
  • 4

7 Answers7

7

A shorter (and I find more neat) way is hostname -i. No more hassle with ipconfig, ip, sed, awk and such.

ott--
  • 846
  • 1
  • 6
  • 12
  • 3
    +1, although note that my manpage says: *-i: Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses instead.* – ire_and_curses Dec 19 '12 at 00:12
  • Unfortunately this only gives me 127.0.1.1. This may be because machine is running behind NAT in VBox. Still a useful answer. Will upvote. – user204863 Dec 19 '12 at 08:35
4

Using ip address show is the way to go. Especially on any modern linux system where the interface you're querying could have multiple addresses that ifconfig wouldn't know about.

$ ip a s eth0 | awk '/inet / {print$2}'
10.13.211.83/24
192.168.17.21/16

And of course if you don't want the netmask, just pipe that to any number of things, e.g.:

cut -d/ -f1

Note: On the same system, ifconfig shows:

$ ifconfig em1 | awk '/inet / {print $2}'
10.13.211.83
rsaw
  • 1,006
  • 1
  • 6
  • 13
1

Try doing this :

ip=$(
    ifconfig eth0 |
    perl -ne 'print $1 if /inet\s.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/'
)
echo "$ip"
Gilles Quénot
  • 31,569
  • 7
  • 64
  • 82
  • Thank you very much, this was what I was looking for! :) – user204863 Dec 18 '12 at 23:10
  • 2
    If you think that the answer is useful, you can 'upvote' it. You can 'accept' the reply too by clicking the outline of the `checkmark` (will be green), this way, people searching stackexchange website will known that the question is well answered. That's how stackechange websites works, thanks ;) – Gilles Quénot Dec 18 '12 at 23:12
  • This only works if your ifconfig answers in English. For other languages, you need to change `/inet\s+ad+r` to what your version says – laurent Dec 19 '12 at 00:39
  • This didn't work for me at all. Why make it so complicated? – rsaw Dec 19 '12 at 01:29
  • @laurent, language don't change anything. Tested both in LANG=C and LANG=fr_FR.UTF-8. Moreover, tested OK on ubuntu 12.10 – Gilles Quénot Dec 19 '12 at 15:35
  • The output of ifconfig is different from language to language and the filter doesn't work. For example instead of `inet addr:` in English (`inet adr:` I suppose in French), in my machine in pt_BR, I have `inet end.:` and the output using your solution is blank. It's only a matter of adapting the filter for each language. – laurent Dec 19 '12 at 15:41
  • New one should work on many use cases – Gilles Quénot Dec 19 '12 at 15:43
  • Ok, it worked with the new one. – laurent Dec 19 '12 at 15:51
  • You really should consider using `ip` instead of `ifconfig`. [ifconfig is deprecated and will most likely be replaced by ip](http://en.wikipedia.org/wiki/ifconfig#Current_status) in future releases of your distro. – jsbillings Dec 19 '12 at 16:12
1

Not answer to your exact problem as you want the IP assigned to a defined interface but I thought it could be usefull to have listed here for future info the way to have your external IP (even if behind a NAT):

ip=`wget -qO- ipecho.net/plain`
laurent
  • 655
  • 4
  • 7
1

Check out also:

ifconfig eth0 | awk '/inet /{print $2}' | cut -f2 -d':'

that will work even in Solaris and HP-UX (use appropriate net dev instead of eth0).

As for hostname -i command, try hostname -I if you have one configured interface (except loopback).

rook
  • 677
  • 2
  • 10
  • 16
0

As you can see, hostname -i can show 127.0.0.1 (no NAT here (archlinux)), this is not what we want.

So I propose :

dev=eth0
ip=$(
    ip a s dev $dev |
        awk '/inet /{gsub("/.*", "");print $2}'
)
echo "$ip"

Or if you have -P switch for grep :

ip a s dev eth0 | grep -oP 'inet\s+\K[^/]+'

I guess that's the shortest solution =)

Gilles Quénot
  • 31,569
  • 7
  • 64
  • 82
-1

Yon can also try this,

IP=`wget -q -O- http://checkip.dyndns.org/index.html | grep 'IP'| html2text | cut -c 21-36`