#!/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 [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) # 2. Fallback: Tailscale DNS (Termux carece de getent, usar python si esta disponible) if [[ -z "$IP" ]]; then 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 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"