Finding the MAC Address of a Raspberry Pi

9

It can sometimes be useful to obtain the MAC address of your Raspberry Pi’s network interfaces. The “Media Access Control” address is a unique identifier given to all networked devices. The address is different for all Pi’s and can be used to identify your device. Think of it as a digital fingerprint. There is a separate MAC address for Ethernet and WiFi interfaces.

There are a number of ways to identify them using the command line or using Python code. Below are some quick examples you can use to find the MAC address.

From the Command Line

To find the MAC address from the command line you need to know the name of the interface. The Ethernet interface used to be called “eth0” but in newer versions of Raspbian it may be “enx########” where ######## is the MAC address. This means the Ethernet interface name is unique for every Pi. The first WiFi interfaces is still named “wlan0”.

You can find the interface names by using :

ls /sys/class/net/

The name will be one of the displayed sub-directories alongside “lo”.

You can then use the following command :

cat /sys/class/net/####/address

or you can type :

ifconfig ####

You should swap #### for the interface name.

This will result in output similar to :

eth0 Link encap:Ethernet  HWaddr c7:35:ce:fd:8e:a1
     inet addr:192.168.0.16  Bcast:192.168.0.255  Mask:255.255.255.0
     inet6 addr: fe80::ba27:ebff:fefc:9fd2/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

or

enxc735cefd8ea1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  inet 192.168.1.12 netmask 255.255.255.0 broadcast 192.168.1.255
  inet6 fe80::5280:6726:a47d:f38c prefixlen 64 scopeid 0x20<link>
  ether c7:35:ce:fd:8e:a1 txqueuelen 1000 (Ethernet)

The “HWaddr” or “ether” value is the MAC address. In this example “c7:35:ce:fd:8e:a1”

Finding the Ethernet Interface Name Using Python

The names used for the Ethernet and wireless interface on the current version of Raspbian are “eth0” and “wlan0”.

In some older iterations of Raspbian these names were based on the MAC address of the interface using what is known as “predictable interface names”. For this reason I created a function to determine the name regardless of the scheme being used :

def getEthName():
  # Get name of the Ethernet interface
  try:
    for root,dirs,files in os.walk('/sys/class/net'):
      for dir in dirs:
        if dir[:3]=='enx' or dir[:3]=='eth':
          interface=dir
  except:
    interface="None"
  return interface

It looks at the sub-directories of /sys/class/net/ and finds either “eth0” or the name starting with “enx”.

In your script you could use this function to read the interface name into a variable :

ethName=getEthName()

Finding the MAC Address Using Python

The following Python function can be used to obtain the MAC address of your Raspberry Pi :

def getMAC(interface='eth0'):
  # Return the MAC address of the specified interface
  try:
    str = open('/sys/class/net/%s/address' %interface).read()
  except:
    str = "00:00:00:00:00:00"
  return str[0:17]

This function can be called using the following line :

getMAC('eth0')

Or if you have a WiFi connection :

getMAC('wlan0')

Combining both functions would give you ability to find the Ethernet interface name and then retrieve the MAC address without worrying about what version of Raspbian was being used:

ethName=getEthName()
ethMAC=getMAC(ethName)
Share.

9 Comments

    • ifconfig and friends are wrappers to the /sys filesystem.

      Isn’t there something nice and simple about read()ing and write()ing to a file rather than spawning another program, and parsing the output?

  1. Several minor fixes and improvements to the Python code:

    1. The open command should not have a comma in the arguments.
    2. readline() could just be read() as there will never be more than one line.
    3. Instead of returning str[0:17] just return str.strip() and it will remove the trailing newline.
    4. (Stylistic only) Try to avoid “str” as the name of a variable, as it masks the str type which is a builtin function. Obviously not important in a tiny function like this but it’s a good practice not to mask builtin names… some day you’ll avoid wasting hours troubleshooting the obscure bugs caused by doing such things.

    • Thanks for the tips. I’m going to be tidying up this function soon so I will take on board all your suggestions. “str” is a stupid name for a variable and I’m not even sure how I didn’t notice that at the time!

  2. Thank you for this! I installed Pidora and ifconfig wasn’t there! Thank you for posting both. I have been working with Linux for years and thanks to ifconfig I had no idea about the underlying file structure.

  3. Alternative method: Plug your Rpi via ethernet cable to your router, switch on, wait a minute, and then check your routers status page for it’s list of connected devices: If it can see the Pi, the MAC address will probably be listed there (works with my “EE Brightbox” router anyway)

Leave A Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.