2026-04-26 22:30:25 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
# ssh-mdns-proxy: Resolve .local via mDNS with fallbacks, then connect
|
|
|
|
|
#
|
|
|
|
|
# Resolution order: mDNS → Tailscale DNS → cached IP
|
|
|
|
|
# Usage: ssh-mdns-proxy <hostname> [port]
|
|
|
|
|
#
|
|
|
|
|
# Configure your Tailscale domain:
|
|
|
|
|
TAILSCALE_DOMAIN="${TAILSCALE_DOMAIN:-tailb0bb74.ts.net}"
|
|
|
|
|
|
|
|
|
|
HOST="$1"
|
|
|
|
|
PORT="${2:-22}"
|
|
|
|
|
CACHE="$HOME/.ssh/mdns-cache"
|
|
|
|
|
QUERY="${HOST%.local}"
|
|
|
|
|
|
|
|
|
|
# Alias mapping (short name -> mDNS hostname)
|
|
|
|
|
declare -A ALIASES=(
|
|
|
|
|
[dell]="dell-latitude3400"
|
|
|
|
|
[lenovo]="lenovo-ideapad"
|
|
|
|
|
)
|
|
|
|
|
[[ -n "${ALIASES[$QUERY]}" ]] && QUERY="${ALIASES[$QUERY]}"
|
|
|
|
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
|
|
|
|
|
|
# 1. mDNS resolution
|
|
|
|
|
IP=$("$SCRIPT_DIR/mdns-resolve" "${QUERY}.local" 2 2>/dev/null)
|
|
|
|
|
|
2026-07-17 14:35:59 +00:00
|
|
|
# 2. Fallback: Tailscale DNS (Termux carece de getent, usar python si esta disponible)
|
2026-04-26 22:30:25 +00:00
|
|
|
if [[ -z "$IP" ]]; then
|
2026-07-17 14:35:59 +00:00
|
|
|
if command -v getent >/dev/null 2>&1; then
|
|
|
|
|
IP=$(getent hosts "${QUERY}.${TAILSCALE_DOMAIN}" 2>/dev/null | awk '{print $1}')
|
|
|
|
|
else
|
|
|
|
|
IP=$(python -c "import socket; print(socket.gethostbyname('${QUERY}.${TAILSCALE_DOMAIN}'))" 2>/dev/null)
|
|
|
|
|
fi
|
2026-04-26 22:30:25 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 3. Fallback: cached IP
|
|
|
|
|
if [[ -z "$IP" && -f "$CACHE" ]]; then
|
|
|
|
|
IP=$(grep "^${QUERY} " "$CACHE" 2>/dev/null | awk '{print $2}')
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -z "$IP" ]]; then
|
|
|
|
|
echo "Error: cannot resolve ${HOST}" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Save to cache
|
|
|
|
|
mkdir -p "$(dirname "$CACHE")"
|
|
|
|
|
grep -v "^${QUERY} " "$CACHE" > "${CACHE}.tmp" 2>/dev/null || true
|
|
|
|
|
echo "${QUERY} ${IP}" >> "${CACHE}.tmp"
|
|
|
|
|
mv "${CACHE}.tmp" "$CACHE"
|
|
|
|
|
|
|
|
|
|
exec nc "$IP" "$PORT"
|