56 lines
1.8 KiB
Bash
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
|