10

I am trying to identify NICs on ~20 remote servers (2-6 NICs on every server). To begin with, I want to identify those ready for use and free ones. How can I check the state of the physical media? I know some ways, including ifconfig|grep RUNNING, ethtool, cat /sys/class/net/eth0/carrier, but all they require that the interface is up. I don't want to bring ALL interfaces up. Not sure why, but I don't like to have enabled, but not configured interfaces in the network. Is there a way I can avoid this?

Or am I just wrong and there's nothing bad about all interfaces being up (and not configured)? Even if they are plugged in?

3 Answers 3

5

ip link show , by default shows all the interfaces, use ip link show up to show only the running interfaces. You could use filters to get the difference.

5
  • Aha. And the missing cable will show up as NO-CARRIER, right?
    – minaev
    Commented Dec 16, 2011 at 11:53
  • Bingo. Thanks. And ip addr show even adds IP addresses to the output.
    – minaev
    Commented Dec 16, 2011 at 12:01
  • 2
    That doesn't work on my machine (Debian squeeze, skge driver): ip link show shows nothing more than “DOWN”. ip reports the same information as ifconfig and /sys/class/net/ in any case, doesn't it? Do you get link status information from ip that's different from what you get under /sys/class/net or from ifconfig on your machine? Or do you get link status about interfaces that are down in /sys/class/net (I get /sys/class/net/eth0/carrier: Invalid argument)? Commented Dec 18, 2011 at 1:12
  • it doesn't work if interface is down. Commented Dec 2, 2015 at 14:21
  • @Nikhil Mulley What do you mean by filters?
    – Joe
    Commented Sep 19, 2016 at 11:08
3

Here is my script to update default routes based on the state of the connection in realtime. (runs in background) works with multiple interfaces, I define priorities in the /tmp/${iface}.metric files, the 'best' connected interface will be used to route default traffic.

#!/bin/sh

/sbin/ip monitor link | while read -r line
do
    iface=$(echo $line | sed -ne 's/[^ ]* \([^ ]*\): .* state \([^ ]*\).*/\1/p')
    state=$(echo $line | sed -ne 's/[^ ]* \([^ ]*\): .* state \([^ ]*\).*/\2/p')
    if [ "$iface" != "" ] ; then
        echo "$iface is $state"
        if [ -f /tmp/${iface}.metric ] ; then
                echo "updating default route for ${iface}"
                if [ "$state" = "DOWN" ] ; then
                        ip route del default dev "${iface}"
                else
                        ip route add default dev "${iface}" metric `cat /tmp/${iface}.metric`
                fi
        fi
    fi
done
1

ip link show displays the flag "LOWER_UP" to indicate the cable in plugged. You can also check for /sys/class/net/eth*/operstate or carrier. However, all of these only work for an interface with an IP address bound on it.

2
  • 1
    Interesting information, but doesn't really answer Original Post.
    – X Tian
    Commented Mar 21, 2014 at 16:45
  • even if I haven't plugin eth, it will say "up" also.
    – kangear
    Commented Apr 17, 2015 at 2:04

You must log in to answer this question.

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