46

I have eth0 and wlan0 according to ifconfig and I can ping google.com. How can I find out (with a normal user, not root) what interface is active, as in, what interface did the ping (or whatever, ping is not mandatory) use?

NOTE: using Ubuntu 11.04 or Fedora 14

  • 2
    The below solutions seem to want you to do the inferring yourself, which doesn't seem right. (And everybody's routing tables look incredibly straightforward!) While I'm looking for the Windows equivalent, it appears that "ip route get <ip-address>" will tell you which interface would be used if you were to attempt to connect to a given ip address. – mwardm Aug 25 '16 at 9:41
  • Related on Server Fault: Find interface for route to specific host (which is what I was looking for when I wound up here). – Wildcard Jul 12 at 22:19

10 Answers 10

47

You can use route to find your default route:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

The Iface column in the line with destination default tells you which interface is used.

  • On Debian at least you need to do /sbin/route. – Faheem Mitha Jun 14 '11 at 9:00
  • @Faheem Because /sbin isn't in normal users' PATH environ. This is pretty standard in most distros, even though it's generally one of the first things sysadmins alter for their 'main' user. – Shadur Jun 14 '11 at 11:07
  • @Shadur: that's not the case in Fedora (as of FC13 if I remember correctly) – nico Jun 14 '11 at 15:57
  • 1
    @Job in case we have an IP address how can we find which interface it uses. – Bionix1441 Nov 30 '17 at 9:51
  • This should not be the accepted answer. If iproute have been used to define custom routing rules route can't be used. @Torgeir have the wright answer. – Joseph Garrone Feb 20 at 18:40
25

My version which is basically based on this and this:

route | grep '^default' | grep -o '[^ ]*$'

And this, experimentally, for macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
  • 1
    is there a way for you to translate this for OSX? – John Allard Sep 28 '17 at 21:41
  • 1
    @JohnAllard: let me know if my update now gives correct answer there for macOS. – Ebrahim Byagowi Oct 10 '17 at 21:11
  • you don't need multiple pipes, just use route |awk '/^default/{print $NF}' – P.... Apr 30 at 15:00
  • I get two lines: "eth0" and "wlan0", so I still don't know which one is active... – AstroFloyd Jul 10 at 7:46
8

On GNU/Linux systems:

#!/bin/sh

# host we want to "reach"
host=google.com

# get the ip of that host (works with dns and /etc/hosts. In case we get  
# multiple IP addresses, we just want one of them
host_ip=$(getent ahosts "$host" | awk '{print $1; exit}')

# only list the interface used to reach a specific host/IP. We only want the part
# between dev and src (use grep for that)
ip route get "$host_ip" | grep -Po '(?<=(dev )).*(?= src| proto)'
  • 1
    Please explain what these commands are doing. Also, you're probably pretty safe here, because you know what your values are, but, generally, you should quote shell variables references (unless you have a good reason not to, and you’re sure you know what you’re doing). – G-Man Oct 30 '14 at 18:51
  • 1
    Done, to some extent. Only posted this because I could not find anything that did exactly this. Am using this as a custom fact in a puppet manifest... – Torgeir Oct 30 '14 at 20:15
  • Your answer is more correct if the host is an input argument to the script. As the route (and hence the interface) might be different for different ips. – kdehairy Apr 25 at 19:52
6

Running ifconfig will give you the information you need.

The active interface will have an inet addr and will show a record of transmitted data, like so:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

You can also use the ip addr command and any inactive interfaces will be designated as having: NO-CARRIER.

  • Since OP doesn't want to be root, maybe you should give full path to the executable? – tshepang Jun 14 '11 at 7:21
  • Neither command requires elevated privileges. – jasonwryan Jun 14 '11 at 7:24
  • 1
    Ubuntu and Arch: both run with normal privileges (although on Ubuntu it is /sbin) – jasonwryan Jun 14 '11 at 7:50
  • 1
    @Shadur Not on my install of Ubuntu 10.10 and according to help.ubuntu.com/community/EnvironmentVariables the default $PATH is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games: – jasonwryan Jun 14 '11 at 18:32
  • 2
    This won't necessarily help on a system with multiple interfaces, as the poster indicated having. A better answer is using the route command though that wouldn't necessarily be foolproof either due to routing. The default route does not have to be the one to get to the Internet though it may often be. – user1801810 Aug 10 '16 at 18:36
6

One liner:

ip route get 8.8.8.8 | sed -n 's/.*dev \([^\ ]*\) table.*/\1/p'

  • There's a dangling quote there. Doesn't work at all as-is – Krease Jan 24 '18 at 19:23
  • @Krease Author updated his answer – Vadim Kotov Jul 10 '18 at 16:07
5

Get the default network interface typically used to route to the "remaining" internet in opposite to DMZ, private network, VM host etc. which are usually routed explicitly.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
  • it is not always the default route that gets you to where you want. Although the OP most probably is using the default route to get to the internet, this is a generalization and might not always hold true. A word of caution – MelBurslan Aug 10 '16 at 17:35
  • Sure, it is only default network interface. If there are multiple connections, one should not really speak about "connecting to the internet", but rather about network interface used for routing to the exact destination. – EugeneP Aug 22 '16 at 11:06
  • You do not need to use multiple pipes/greps , ip -4 route ls |awk '/^default/{print $5}' – P.... Apr 30 at 15:01
2

The command ip route ls will give a list of active routes and their sources:

caleburn: ~/ >ip route ls
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.7 
default via 192.168.10.254 dev eth0 
1

Use command:

[root@linux1 network-scripts]# route|grep default | awk '{print $8}'
enp0s3
  • [root@linux1 network-scripts]# route|grep default | awk '{print $8}' enp0s3 [root@linux1 network-scripts]# – Larry Catt Aug 17 '16 at 16:46
0

use the below one:

ip r | grep default
0

If your machine has multiple interfaces (which I assume), there is no one interface that will be used for connecting to the internet.

Depending on the destination you are connecting to, your system will consult the ip table (the one shown when you do route command) to find the next hope/router, when it does find one, it will use the interface associated with it.

That said, please refer to @torgeir's answer as it does exactly that:

  1. Given a domain (hardcoded as google.com, which is the only bad point in the answer)
  2. Resolves it's ip
  3. Consults the ip table for the route to use (and hence the interface).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.