Skip to content
Switch branches/tags
Go to file
Cannot retrieve contributors at this time

How to spoof MAC address and hostname automatically at boot on macOS

How to spoof MAC address and hostname automatically at boot on macOS

Heads-up: unfortunately, it is not possible to spoof MAC address on some Macs (see issue).


  • Computer running macOS Catalina or Big Sur


  • When copy/pasting commands that start with $, strip out $ as this character is not part of the command
  • When copy/pasting commands that start with cat << "EOF", select all lines at once (from cat << "EOF" to EOF inclusively) as they are part of the same (single) command


Step 1: create /usr/local/sbin directory

sudo mkdir -p /usr/local/sbin
sudo chown ${USER}:admin /usr/local/sbin

Step 2: add /usr/local/sbin directory to PATH environment variable

echo 'export PATH=$PATH:/usr/local/sbin' >> ~/.zshrc
source ~/.zshrc

Step 3: download first-names.txt

This list includes the top 2048 most popular baby names from the USA Social Security Administration.

curl --fail --output /usr/local/sbin/first-names.txt

Step 4: download mac-address-prefixes.txt

This list includes 768 Apple MAC address prefixes.

curl --fail --output /usr/local/sbin/mac-address-prefixes.txt

Step 5: create script

cat << "EOF" > /usr/local/sbin/
#! /bin/sh

set -e
set -o pipefail

export LC_CTYPE=C

basedir=$(dirname "$0")

# Spoof computer name
first_name=$(sed "$(jot -r 1 1 2048)q;d" $basedir/first-names.txt | sed -e 's/[^a-zA-Z]//g')
model_name=$(system_profiler SPHardwareDataType | awk '/Model Name/ {$1=$2=""; print $0}' | sed -e 's/^[ ]*//')
computer_name="$first_name’s $model_name"
host_name=$(echo $computer_name | sed -e 's/’//g' | sed -e 's/ /-/g')
sudo scutil --set ComputerName "$computer_name"
sudo scutil --set LocalHostName "$host_name"
sudo scutil --set HostName "$host_name"
printf "%s\n" "Spoofed hostname to $host_name"

# Spoof MAC address of Wi-Fi interface
mac_address_prefix=$(sed "$(jot -r 1 1 768)q;d" $basedir/mac-address-prefixes.txt | sed -e 's/[^A-F0-9:]//g')
mac_address_suffix=$(openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//')
mac_address=$(echo "$mac_address_prefix:$mac_address_suffix" | awk '{print toupper($0)}')
networksetup -setairportpower en0 on
sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --disassociate
sudo ifconfig en0 ether "$mac_address"
printf "%s\n" "Spoofed MAC address of en0 interface to $mac_address"

Step 6: make executable

chmod +x /usr/local/sbin/

Step 7: create local.spoof.plist launch daemon

cat << "EOF" | sudo tee /Library/LaunchDaemons/local.spoof.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">



Step 8: create script

cat << "EOF" > /usr/local/sbin/
#! /bin/sh

# Turn off Wi-Fi interface
networksetup -setairportpower en0 off

Step 9: make executable

chmod +x /usr/local/sbin/

Step 10: make sure does not exist

Heads-up: if exists, one needs to backup user default carefully and consider using an abstraction that runs both current LogoutHook script and /usr/local/sbin/

$ sudo defaults read
2021-09-27 06:58:02.301 defaults[2267:25227]
Domain does not exist

Domain does not exist


Step 11: configure user default (used to disable Wi-Fi interface at logout)

sudo defaults write LogoutHook "/usr/local/sbin/"

Step 12: reboot and confirm hostname and MAC address have been spoofed

Spoofed hostname

$ scutil --get HostName

Spoofed MAC address

$ ifconfig en0 | grep ether | awk '{print $2}'

Hardware MAC address

$ networksetup -listallhardwareports | awk -v RS= '/en0/{print $NF}'

“Spoofed hostname” is random and “Spoofed MAC address” does not match “Hardware MAC address”?


Want things back the way they were before following this guide? No problem!

Step 1: delete files

rm /usr/local/sbin/first-names.txt
rm /usr/local/sbin/mac-address-prefixes.txt
rm /usr/local/sbin/
rm /usr/local/sbin/
sudo rm /Library/LaunchDaemons/local.spoof.plist

Step 2: delete user default

sudo defaults delete LogoutHook

Step 3: set computer name, local hostname and hostname

Replace John with your name.

sudo scutil --set ComputerName "John’s MacBook Pro"
sudo scutil --set LocalHostName "Johns-MacBook-Pro"
sudo scutil --set HostName "Johns-MacBook-Pro"

Step 4: reboot