From fb245e20dfc9daea2732098870a5de327c51dce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Eduardo=20Garc=C3=ADa=20M=C3=A1rquez?= Date: Thu, 26 Mar 2026 07:04:52 -0500 Subject: [PATCH] fix: hacer repo replicable para cualquier persona - install.sh: pide nombre de dispositivo, usuario, contrasena y personaliza smb.conf y mdns-publish.py automaticamente - install.sh: ejecuta termux-setup-storage si no hay acceso - install.sh: instala netcat-openbsd (dependencia de ssh scripts) - install.sh: agrega PATH a .bashrc si falta - Shebangs portables: #!/usr/bin/env en todos los scripts - ssh-mdns-proxy: dominio Tailscale y aliases como variables con comentarios PERSONALIZAR para el usuario - ssh-config.example: ejemplo de ~/.ssh/config listo para copiar - smb.conf: valid users se reemplaza durante instalacion Co-Authored-By: Claude Opus 4.6 --- install.sh | 77 ++++++++++++++++++++++++++--------------- scripts/mdns-publish.py | 2 +- scripts/mdns-resolve | 2 +- scripts/ssh-fallback | 2 +- scripts/ssh-mdns-proxy | 25 +++++++++---- ssh-config.example | 32 +++++++++++++++++ 6 files changed, 102 insertions(+), 38 deletions(-) create mode 100644 ssh-config.example diff --git a/install.sh b/install.sh index 9575d52..fc16ddc 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,4 @@ -#!/data/data/com.termux/files/usr/bin/bash +#!/usr/bin/env bash # Instalador de Samba + mDNS + scripts de red para Termux # Uso: bash install.sh set -e @@ -19,49 +19,63 @@ error() { echo -e "${RED}[x]${NC} $1"; exit 1; } # 1. Verificar Termux [ -n "$PREFIX" ] || error "No es Termux. Este script solo funciona en Termux." -# 2. Instalar dependencias +# 2. Storage de Android +if [ ! -d "$HOME/storage" ]; then + info "Configurando acceso al almacenamiento Android..." + termux-setup-storage + sleep 3 +fi + +# 3. Instalar dependencias info "Instalando paquetes..." -pkg install -y samba python 2>/dev/null +pkg install -y samba python netcat-openbsd 2>/dev/null pip install -q zeroconf 2>/dev/null -# 3. Crear directorios +# 4. Crear directorios info "Creando directorios..." mkdir -p "$SAMBA_DIR"/{private,lock,state,cache} chmod 0755 "$SAMBA_DIR"/{lock,state,cache} mkdir -p "$BIN_DIR" -# 4. Copiar config Samba -info "Copiando smb.conf..." -cp "$SCRIPT_DIR/smb.conf" "$SAMBA_DIR/smb.conf" +# 5. Preguntar configuracion personalizada +echo "" +info "=== Configuracion ===" +read -p "Usuario Samba [andres]: " SMB_USER +SMB_USER="${SMB_USER:-andres}" +read -s -p "Contrasena Samba: " SMB_PASS +echo "" +read -p "Nombre del dispositivo en la red [movil]: " DEVICE_NAME +DEVICE_NAME="${DEVICE_NAME:-movil}" -# 5. Copiar scripts de red +# 6. Copiar y personalizar smb.conf +info "Configurando Samba..." +sed "s/valid users = andres/valid users = $SMB_USER/g; \ + s/netbios name = MOVIL/netbios name = ${DEVICE_NAME^^}/g" \ + "$SCRIPT_DIR/smb.conf" > "$SAMBA_DIR/smb.conf" + +# 7. Copiar y personalizar scripts de red info "Instalando scripts de red..." for script in mdns-publish.py mdns-resolve ssh-mdns-proxy ssh-fallback; do cp "$SCRIPT_DIR/scripts/$script" "$BIN_DIR/$script" chmod +x "$BIN_DIR/$script" done + +# Personalizar hostname en mdns-publish.py +sed -i "s/HOSTNAME = 'movil'/HOSTNAME = '$DEVICE_NAME'/" "$BIN_DIR/mdns-publish.py" + info " mdns-publish.py - Publica SSH + SMB via mDNS" info " mdns-resolve - Resuelve hostnames .local" info " ssh-mdns-proxy - ProxyCommand SSH con mDNS + fallback" info " ssh-fallback - ProxyCommand SSH Tailscale + LAN" -# 6. Crear usuario Samba -info "Configurando usuario Samba..." -read -p "Usuario Samba [andres]: " SMB_USER -SMB_USER="${SMB_USER:-andres}" -read -s -p "Contrasena Samba: " SMB_PASS -echo "" +# 8. Crear usuario Samba +info "Creando usuario Samba '$SMB_USER'..." printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \ smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" -a "$SMB_USER" 2>/dev/null || \ printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \ smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" "$SMB_USER" -# 7. Verificar storage -if [ ! -d "/storage/emulated/0" ]; then - warn "Storage no accesible. Ejecuta: termux-setup-storage" -fi - -# 8. Agregar a .bashrc si no existe +# 9. Agregar a .bashrc si no existe if ! grep -q "smbd" "$HOME/.bashrc" 2>/dev/null; then info "Agregando autostart a .bashrc..." cat "$SCRIPT_DIR/bashrc-snippet.sh" >> "$HOME/.bashrc" @@ -69,13 +83,16 @@ else warn "Autostart ya existe en .bashrc, no se modifica" fi -# 9. Verificar PATH +# 10. Verificar PATH if ! echo "$PATH" | grep -q "$BIN_DIR"; then - warn "Agrega esto a tu .bashrc si no esta:" - echo " export PATH=\"\$HOME/.local/bin:\$PATH\"" + if ! grep -q '.local/bin' "$HOME/.bashrc" 2>/dev/null; then + echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc" + info "PATH actualizado en .bashrc" + fi + export PATH="$BIN_DIR:$PATH" fi -# 10. Iniciar servicios +# 11. Iniciar servicios info "Iniciando Samba..." pkill smbd 2>/dev/null || true sleep 1 @@ -87,17 +104,21 @@ sleep 1 nohup python "$BIN_DIR/mdns-publish.py" > /dev/null 2>&1 & disown -# 11. Verificar +# 12. Verificar sleep 2 if pgrep -x smbd > /dev/null && pgrep -f mdns-publish > /dev/null; then + LOCAL_IP=$(python -c "import socket; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.connect(('8.8.8.8',80)); print(s.getsockname()[0]); s.close()" 2>/dev/null || echo "???") info "Todo corriendo." echo "" - echo " Nombre en red: movil" + echo " Nombre en red: $DEVICE_NAME" echo " Puerto: 4450" echo " Usuario: $SMB_USER" + echo " IP actual: $LOCAL_IP" echo "" - echo " Desde Linux: smb://movil.local:4450/" - echo " Desde Windows: \\\\IP:4450\\" + echo " Desde Linux: smb://${DEVICE_NAME}.local:4450/" + echo " Desde Windows: \\\\${LOCAL_IP}:4450\\" + echo "" + echo " Para SSH inteligente, copia ssh-config.example a ~/.ssh/config" echo "" else error "Algo fallo. Revisa: smb-status / mdns-status" diff --git a/scripts/mdns-publish.py b/scripts/mdns-publish.py index 189c946..5f36213 100755 --- a/scripts/mdns-publish.py +++ b/scripts/mdns-publish.py @@ -1,4 +1,4 @@ -#!/data/data/com.termux/files/usr/bin/python +#!/usr/bin/env python3 """Publica servicios via mDNS/Zeroconf: SSH + Samba""" import socket import signal diff --git a/scripts/mdns-resolve b/scripts/mdns-resolve index 4a069d6..5fafd01 100755 --- a/scripts/mdns-resolve +++ b/scripts/mdns-resolve @@ -1,4 +1,4 @@ -#!/data/data/com.termux/files/usr/bin/python3 +#!/usr/bin/env python3 """ Resuelve hostname.local via mDNS multicast. Uso: mdns-resolve diff --git a/scripts/ssh-fallback b/scripts/ssh-fallback index bcd6ac1..478475e 100755 --- a/scripts/ssh-fallback +++ b/scripts/ssh-fallback @@ -1,4 +1,4 @@ -#!/data/data/com.termux/files/usr/bin/bash +#!/usr/bin/env bash # # ssh-fallback: Proxy para SSH con fallback automático # Usado como ProxyCommand en ~/.ssh/config diff --git a/scripts/ssh-mdns-proxy b/scripts/ssh-mdns-proxy index 8a27135..8363295 100755 --- a/scripts/ssh-mdns-proxy +++ b/scripts/ssh-mdns-proxy @@ -1,26 +1,37 @@ -#\!/data/data/com.termux/files/usr/bin/bash +#!/usr/bin/env bash # ssh-mdns-proxy: Resolve .local via mDNS with fallbacks, then connect +# Usado como ProxyCommand en ~/.ssh/config +# +# PERSONALIZAR: +# - ALIASES: agregar tus hosts con nombres cortos +# - TS_DOMAIN: cambiar a tu dominio Tailscale (ver: tailscale status) +# - Si no usas Tailscale, el fallback simplemente se salta + HOST="$1" PORT="${2:-22}" CACHE="$HOME/.ssh/mdns-cache" QUERY="${HOST%.local}" -# Alias mapping (short name → mDNS hostname) +# --- PERSONALIZAR: aliases de tus equipos --- declare -A ALIASES=( [dell]="dell-latitude3400" [lenovo]="lenovo-ideapad" ) + +# --- PERSONALIZAR: dominio Tailscale --- +TS_DOMAIN="tailb0bb74.ts.net" + [[ -n "${ALIASES[$QUERY]}" ]] && QUERY="${ALIASES[$QUERY]}" -# 1. mDNS resolution +# 1. mDNS resolution (red local) IP=$("$HOME/.local/bin/mdns-resolve" "${QUERY}.local" 2 2>/dev/null) -# 2. Fallback: Tailscale DNS +# 2. Fallback: Tailscale DNS (fuera de LAN) if [[ -z "$IP" ]]; then - IP=$(getent hosts "${QUERY}.tailb0bb74.ts.net" 2>/dev/null | awk "{print \$1}") + IP=$(getent hosts "${QUERY}.${TS_DOMAIN}" 2>/dev/null | awk "{print \$1}") fi -# 3. Fallback: cached IP +# 3. Fallback: cached IP (si todo falla) if [[ -z "$IP" && -f "$CACHE" ]]; then IP=$(grep "^${QUERY} " "$CACHE" 2>/dev/null | awk "{print \$2}") fi @@ -30,7 +41,7 @@ if [[ -z "$IP" ]]; then exit 1 fi -# Save to cache +# Save to cache for next time mkdir -p "$(dirname "$CACHE")" grep -v "^${QUERY} " "$CACHE" > "${CACHE}.tmp" 2>/dev/null || true echo "${QUERY} ${IP}" >> "${CACHE}.tmp" diff --git a/ssh-config.example b/ssh-config.example new file mode 100644 index 0000000..2039af6 --- /dev/null +++ b/ssh-config.example @@ -0,0 +1,32 @@ +# Ejemplo de ~/.ssh/config para usar con los scripts de red +# +# ssh-mdns-proxy resuelve en este orden: +# 1. mDNS (.local) - red LAN +# 2. Tailscale DNS - fuera de LAN +# 3. Cache local - si todo falla +# +# Personalizar: +# - Cambiar User por tu usuario +# - Cambiar tailb0bb74 por tu dominio Tailscale +# - Agregar/quitar hosts segun tu red +# - Los aliases (dell, lenovo) se configuran en ssh-mdns-proxy + +Host lenovo-ideapad + HostName lenovo-ideapad + User andres + ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p + +Host hp62a + HostName hp62a + User andres + ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p + +Host dell + HostName dell + User andres + ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p + +# Ejemplo con ssh-fallback (Tailscale + IP LAN fija): +# Host servidor +# User usuario +# ProxyCommand ~/.local/bin/ssh-fallback servidor.tailXXXXX.ts.net 192.168.1.X %p