Proxmox-WOL-Server/pve-list-mac-addresses.sh
2025-12-11 04:27:50 +01:00

56 lines
1.8 KiB
Bash

#!/usr/bin/env bash
# list-pve-vm-macs.sh
# List MAC addresses for all QEMU VMs on this PVE node.
set -Eeuo pipefail
# Header
printf '%-5s %-25s %-5s %-17s %-10s\n' "ID" "NAME" "IF" "MAC" "BRIDGE"
printf '%s\n' "---------------------------------------------------------------------"
# Alle VMIDs holen (erste Zeile ist Header)
qm list | awk 'NR>1 {print $1}' | while read -r vmid; do
# Name aus der VM-Config holen
name="$(qm config "$vmid" | awk -F': ' '/^name:/ {print $2; exit}')"
[ -z "${name:-}" ] && name="<no-name>"
# Netzwerkkarten aus der Config parsen
qm config "$vmid" | awk -v vmid="$vmid" -v name="$name" '
/^net[0-9]+:/ {
# Beispiel:
# net0: virtio=DE:AD:BE:EF:01:02,bridge=vmbr0,firewall=1
net = $1
sub(":", "", net) # "net0:" -> "net0"
line = $0
sub(/^net[0-9]+:[[:space:]]*/, "", line)
mac = ""
bridge = ""
# In Komma-getrennte Optionen splitten
n = split(line, parts, ",")
for (i = 1; i <= n; i++) {
# führende Spaces entfernen
gsub(/^[[:space:]]+/, "", parts[i])
if (index(parts[i], "=") == 0)
continue
split(parts[i], kv, "=")
key = kv[1]
val = kv[2]
# MAC erkennen: 6x 2 Hex-Zeichen mit :
if (val ~ /^[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]$/) {
mac = val
} else if (key == "bridge") {
bridge = val
}
}
printf "%-5s %-25s %-5s %-17s %-10s\n", vmid, name, net, mac, bridge
}
'
done