81

I want to check if a specified ethX is physically up or down. How do I do that with the command line?

Juliano
  • 5,402
  • 27
  • 28
Jader Dias
  • 4,625
  • 18
  • 48
  • 50

10 Answers10

81

$ ethtool <eth?>

For example:

$ ethtool eth0

provides:

Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000001 (1)
        Link detected: yes
Destroyica
  • 103
  • 4
53

Check /sys/class/net/eth0/operstate and other files in this directory.

As far as I know this is specific to Linux 2.6+, but it provides a clean interface to the kernel driver.

Full documentation for this part of the sys file system can be found here:

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net

jncraton
  • 103
  • 3
Linuxtraveler
  • 531
  • 4
  • 2
36

ethtool [interface]

last line shows what you want:

# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: g
        Wake-on: d
        Current message level: 0x00000037 (55)
        Link detected: yes
Kurt
  • 1,293
  • 9
  • 9
  • 4
    If you check this: http://en.wikipedia.org/wiki/OSI_model . You will see that the last line is about another layer: the link layer. I just tested this. With a bad cable the physical layer was up, but not the link layer. Then I switched to another cable and all layers came up. – Jader Dias May 30 '09 at 19:37
28
ip link show

is another. Good old

ifconfig dev_name

or

ifconfig -a

will also tell you if the interface is up. NOTE: Use caution with these methods since they can show out of date information regarding the link's state.

slm
  • 7,355
  • 16
  • 54
  • 72
goo
  • 2,838
  • 18
  • 15
  • I think this was the best answer - ethtool isn't standard in my Ubuntu distibution, so it doesn't help if on a box not connected to the net. – user20010 Sep 25 '13 at 21:32
  • 4
    I believe ifconfig will sometimes show out of date data. It can show UP when the link is down, but ethtool interface will always show the right info AFAIK. – sed_and_done Oct 08 '15 at 17:15
  • 2
    I think @sed_and_done is right. On a Red Hat VM, if I disconnect the NIC, ethtool immediately shows `Link detected: no` instead of `Link detected: yes`, and **ip link show** shows `` instead of ``, but **ifconfig -a** shows `UP BROADCAST MULTICAST MTU:1500 Metric:1`, which is the same as when the NIC is connected. – Adi Inbar May 04 '17 at 18:16
18
dmesg | grep eth

you should see all statuschanges

lepole
  • 1,723
  • 1
  • 10
  • 17
9

You can also use mii-tool to see if the link is up and check the negotiated speed.

# mii-tool
eth0: negotiated 100baseTx-FD, link ok

Alakdae
  • 1,213
  • 8
  • 21
7

To quickly add to @goo's answer, you would interpret the ip link or ip link show INTERFACE as follows.

This is a port which is administratively up, but physically down:

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000

In other words, the UP you can see indicates the system is configured to try and use the NIC for networking. The NO-CARRIER here tells you what the issue preventing networking from working is.

This is a port that is administratively down (its physical layer is 'up', technically - it is a VM):

3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

Finally, this port is working normally:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP mode DEFAULT group default qlen 1000

It is administratively UP, the LOWER_UP indicates the physical layer is working (i.e. there is a carrier), and the second UP confirms (in effect) the IP layer is up.

iwaseatenbyagrue
  • 3,588
  • 12
  • 22
3

You can have full details with below command

ethtool eth0

And if you just want to see link status the give below command

mii-tool eth0
mzhaase
  • 3,778
  • 2
  • 19
  • 32
2

netplugd is a service that can run program(s) when a cable is plugged in or a cable taken out. So the command line would be to grep /var/log/messages or dmesg for netplugd output.

rjt
  • 568
  • 5
  • 25
2

If your system is using ifplugd (e.g. on a Raspberry Pi with Raspbian) then you can use the associated status tool ifplugstatus to obtain the link status of all interfaces:

ifplugstatus

or a specific interface (e.g. eth0):

ifplugstatus eth0
Pierz
  • 553
  • 6
  • 9