Repository navigation
Expand file tree
/
Copy pathspoof-mac-addresses.bash
More file actions
executable file
·70 lines (63 loc) · 2.07 KB
/
Copy pathspoof-mac-addresses.bash
File metadata and controls
executable file
·70 lines (63 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/bash
set -euo pipefail
log() { printf \
'%s [INFO] %s\n' \
"$(date '+%Y-%m-%d %H:%M:%S')" "$*"; }
warn() { printf \
'%s [WARN] %s\n' \
"$(date '+%Y-%m-%d %H:%M:%S')" "$*" >&2; }
error() { printf \
'%s [ERROR] %s\n' \
"$(date '+%Y-%m-%d %H:%M:%S')" "$*" >&2; }
# MAC addresses spoofing script for Linux
# Copyright (C) 2019 madaidan
# Copyright (C) 2025-2026 David Uhden Collado
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Function to spoof MAC addresses
spoof_mac_addresses() {
# Get list of network interfaces.
# Excludes loopback and virtual machine interfaces.
# Use a safe glob/for loop instead of `ls | grep`
# to handle arbitrary interface names.
for p in /sys/class/net/*; do
[ -e "$p" ] || continue
iface=${p##*/}
# Skip loopback, tunnels and virtual/bridge
# interfaces that have no (or a shared) hardware
# address to randomize.
case "$iface" in
lo | tun* | tap* | virbr* | docker* | veth* | \
br-* | bond* | dummy* | wg* | vmnet*)
continue
;;
esac
# A device must be down while its address is changed.
if ! ip link set dev "$iface" down; then
warn "could not bring $iface down; skipping"
continue
fi
# -A randomizes both the vendor OUI and the device
# bytes. (-e would keep the manufacturer prefix, which
# weakens the privacy goal of this measure.)
macchanger -A "$iface" >/dev/null ||
warn "macchanger failed on $iface"
ip link set dev "$iface" up ||
warn "could not bring $iface up"
done
}
main() {
spoof_mac_addresses
}
main "$@"