#!/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="" # 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