diff --git a/scripts/smoke-vm.sh b/scripts/smoke-vm.sh index f04df4d..b7fee34 100755 --- a/scripts/smoke-vm.sh +++ b/scripts/smoke-vm.sh @@ -153,14 +153,19 @@ MAC_LOWER="$(echo "$MAC" | tr 'A-Z' 'a-z')" IP="" deadline=$((SECONDS + 150)) while (( SECONDS < deadline )); do + # Capture-then-parse instead of piping directly into awk. `awk '... exit'` + # exits on first match, which SIGPIPEs the upstream arp-scan (exit 141). + # With `set -o pipefail` active that kills the whole script — exactly what + # happened the first time host-networking gave arp-scan real matches. + SCAN="" if command -v arp-scan >/dev/null 2>&1; then - IP="$(sudo arp-scan --localnet --quiet --ignoredups 2>/dev/null \ - | awk -v m="$MAC_LOWER" 'tolower($2) == m { print $1; exit }')" + SCAN="$(sudo arp-scan --localnet --quiet --ignoredups 2>/dev/null || true)" + IP="$(awk -v m="$MAC_LOWER" 'tolower($2) == m { print $1; exit }' <<<"$SCAN")" fi if [[ -z "$IP" ]] && command -v nmap >/dev/null 2>&1; then sudo nmap -sn -T4 192.168.178.0/24 >/dev/null 2>&1 || true - IP="$(ip neigh show \ - | awk -v m="$MAC_LOWER" 'tolower($5) == m && $1 ~ /^[0-9]/ { print $1; exit }')" + NEIGH="$(ip neigh show)" + IP="$(awk -v m="$MAC_LOWER" 'tolower($5) == m && $1 ~ /^[0-9]/ { print $1; exit }' <<<"$NEIGH")" fi [[ -n "$IP" ]] && break sleep 5