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 <noreply@anthropic.com>
This commit is contained in:
parent
66a9b4afbf
commit
fb245e20df
77
install.sh
77
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
|
# Instalador de Samba + mDNS + scripts de red para Termux
|
||||||
# Uso: bash install.sh
|
# Uso: bash install.sh
|
||||||
set -e
|
set -e
|
||||||
|
|
@ -19,49 +19,63 @@ error() { echo -e "${RED}[x]${NC} $1"; exit 1; }
|
||||||
# 1. Verificar Termux
|
# 1. Verificar Termux
|
||||||
[ -n "$PREFIX" ] || error "No es Termux. Este script solo funciona en 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..."
|
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
|
pip install -q zeroconf 2>/dev/null
|
||||||
|
|
||||||
# 3. Crear directorios
|
# 4. Crear directorios
|
||||||
info "Creando directorios..."
|
info "Creando directorios..."
|
||||||
mkdir -p "$SAMBA_DIR"/{private,lock,state,cache}
|
mkdir -p "$SAMBA_DIR"/{private,lock,state,cache}
|
||||||
chmod 0755 "$SAMBA_DIR"/{lock,state,cache}
|
chmod 0755 "$SAMBA_DIR"/{lock,state,cache}
|
||||||
mkdir -p "$BIN_DIR"
|
mkdir -p "$BIN_DIR"
|
||||||
|
|
||||||
# 4. Copiar config Samba
|
# 5. Preguntar configuracion personalizada
|
||||||
info "Copiando smb.conf..."
|
echo ""
|
||||||
cp "$SCRIPT_DIR/smb.conf" "$SAMBA_DIR/smb.conf"
|
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..."
|
info "Instalando scripts de red..."
|
||||||
for script in mdns-publish.py mdns-resolve ssh-mdns-proxy ssh-fallback; do
|
for script in mdns-publish.py mdns-resolve ssh-mdns-proxy ssh-fallback; do
|
||||||
cp "$SCRIPT_DIR/scripts/$script" "$BIN_DIR/$script"
|
cp "$SCRIPT_DIR/scripts/$script" "$BIN_DIR/$script"
|
||||||
chmod +x "$BIN_DIR/$script"
|
chmod +x "$BIN_DIR/$script"
|
||||||
done
|
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-publish.py - Publica SSH + SMB via mDNS"
|
||||||
info " mdns-resolve - Resuelve hostnames .local"
|
info " mdns-resolve - Resuelve hostnames .local"
|
||||||
info " ssh-mdns-proxy - ProxyCommand SSH con mDNS + fallback"
|
info " ssh-mdns-proxy - ProxyCommand SSH con mDNS + fallback"
|
||||||
info " ssh-fallback - ProxyCommand SSH Tailscale + LAN"
|
info " ssh-fallback - ProxyCommand SSH Tailscale + LAN"
|
||||||
|
|
||||||
# 6. Crear usuario Samba
|
# 8. Crear usuario Samba
|
||||||
info "Configurando usuario Samba..."
|
info "Creando usuario Samba '$SMB_USER'..."
|
||||||
read -p "Usuario Samba [andres]: " SMB_USER
|
|
||||||
SMB_USER="${SMB_USER:-andres}"
|
|
||||||
read -s -p "Contrasena Samba: " SMB_PASS
|
|
||||||
echo ""
|
|
||||||
printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \
|
printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \
|
||||||
smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" -a "$SMB_USER" 2>/dev/null || \
|
smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" -a "$SMB_USER" 2>/dev/null || \
|
||||||
printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \
|
printf '%s\n%s\n' "$SMB_PASS" "$SMB_PASS" | \
|
||||||
smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" "$SMB_USER"
|
smbpasswd -L -s -c "$SAMBA_DIR/smb.conf" "$SMB_USER"
|
||||||
|
|
||||||
# 7. Verificar storage
|
# 9. Agregar a .bashrc si no existe
|
||||||
if [ ! -d "/storage/emulated/0" ]; then
|
|
||||||
warn "Storage no accesible. Ejecuta: termux-setup-storage"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 8. Agregar a .bashrc si no existe
|
|
||||||
if ! grep -q "smbd" "$HOME/.bashrc" 2>/dev/null; then
|
if ! grep -q "smbd" "$HOME/.bashrc" 2>/dev/null; then
|
||||||
info "Agregando autostart a .bashrc..."
|
info "Agregando autostart a .bashrc..."
|
||||||
cat "$SCRIPT_DIR/bashrc-snippet.sh" >> "$HOME/.bashrc"
|
cat "$SCRIPT_DIR/bashrc-snippet.sh" >> "$HOME/.bashrc"
|
||||||
|
|
@ -69,13 +83,16 @@ else
|
||||||
warn "Autostart ya existe en .bashrc, no se modifica"
|
warn "Autostart ya existe en .bashrc, no se modifica"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 9. Verificar PATH
|
# 10. Verificar PATH
|
||||||
if ! echo "$PATH" | grep -q "$BIN_DIR"; then
|
if ! echo "$PATH" | grep -q "$BIN_DIR"; then
|
||||||
warn "Agrega esto a tu .bashrc si no esta:"
|
if ! grep -q '.local/bin' "$HOME/.bashrc" 2>/dev/null; then
|
||||||
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc"
|
||||||
|
info "PATH actualizado en .bashrc"
|
||||||
|
fi
|
||||||
|
export PATH="$BIN_DIR:$PATH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 10. Iniciar servicios
|
# 11. Iniciar servicios
|
||||||
info "Iniciando Samba..."
|
info "Iniciando Samba..."
|
||||||
pkill smbd 2>/dev/null || true
|
pkill smbd 2>/dev/null || true
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
@ -87,17 +104,21 @@ sleep 1
|
||||||
nohup python "$BIN_DIR/mdns-publish.py" > /dev/null 2>&1 &
|
nohup python "$BIN_DIR/mdns-publish.py" > /dev/null 2>&1 &
|
||||||
disown
|
disown
|
||||||
|
|
||||||
# 11. Verificar
|
# 12. Verificar
|
||||||
sleep 2
|
sleep 2
|
||||||
if pgrep -x smbd > /dev/null && pgrep -f mdns-publish > /dev/null; then
|
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."
|
info "Todo corriendo."
|
||||||
echo ""
|
echo ""
|
||||||
echo " Nombre en red: movil"
|
echo " Nombre en red: $DEVICE_NAME"
|
||||||
echo " Puerto: 4450"
|
echo " Puerto: 4450"
|
||||||
echo " Usuario: $SMB_USER"
|
echo " Usuario: $SMB_USER"
|
||||||
|
echo " IP actual: $LOCAL_IP"
|
||||||
echo ""
|
echo ""
|
||||||
echo " Desde Linux: smb://movil.local:4450/"
|
echo " Desde Linux: smb://${DEVICE_NAME}.local:4450/"
|
||||||
echo " Desde Windows: \\\\IP:4450\\"
|
echo " Desde Windows: \\\\${LOCAL_IP}:4450\\"
|
||||||
|
echo ""
|
||||||
|
echo " Para SSH inteligente, copia ssh-config.example a ~/.ssh/config"
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
error "Algo fallo. Revisa: smb-status / mdns-status"
|
error "Algo fallo. Revisa: smb-status / mdns-status"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/data/data/com.termux/files/usr/bin/python
|
#!/usr/bin/env python3
|
||||||
"""Publica servicios via mDNS/Zeroconf: SSH + Samba"""
|
"""Publica servicios via mDNS/Zeroconf: SSH + Samba"""
|
||||||
import socket
|
import socket
|
||||||
import signal
|
import signal
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/data/data/com.termux/files/usr/bin/python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Resuelve hostname.local via mDNS multicast.
|
Resuelve hostname.local via mDNS multicast.
|
||||||
Uso: mdns-resolve <hostname.local>
|
Uso: mdns-resolve <hostname.local>
|
||||||
|
|
|
||||||
|
|
@ -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
|
# ssh-fallback: Proxy para SSH con fallback automático
|
||||||
# Usado como ProxyCommand en ~/.ssh/config
|
# Usado como ProxyCommand en ~/.ssh/config
|
||||||
|
|
|
||||||
|
|
@ -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
|
# 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"
|
HOST="$1"
|
||||||
PORT="${2:-22}"
|
PORT="${2:-22}"
|
||||||
CACHE="$HOME/.ssh/mdns-cache"
|
CACHE="$HOME/.ssh/mdns-cache"
|
||||||
QUERY="${HOST%.local}"
|
QUERY="${HOST%.local}"
|
||||||
|
|
||||||
# Alias mapping (short name → mDNS hostname)
|
# --- PERSONALIZAR: aliases de tus equipos ---
|
||||||
declare -A ALIASES=(
|
declare -A ALIASES=(
|
||||||
[dell]="dell-latitude3400"
|
[dell]="dell-latitude3400"
|
||||||
[lenovo]="lenovo-ideapad"
|
[lenovo]="lenovo-ideapad"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# --- PERSONALIZAR: dominio Tailscale ---
|
||||||
|
TS_DOMAIN="tailb0bb74.ts.net"
|
||||||
|
|
||||||
[[ -n "${ALIASES[$QUERY]}" ]] && QUERY="${ALIASES[$QUERY]}"
|
[[ -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)
|
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
|
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
|
fi
|
||||||
|
|
||||||
# 3. Fallback: cached IP
|
# 3. Fallback: cached IP (si todo falla)
|
||||||
if [[ -z "$IP" && -f "$CACHE" ]]; then
|
if [[ -z "$IP" && -f "$CACHE" ]]; then
|
||||||
IP=$(grep "^${QUERY} " "$CACHE" 2>/dev/null | awk "{print \$2}")
|
IP=$(grep "^${QUERY} " "$CACHE" 2>/dev/null | awk "{print \$2}")
|
||||||
fi
|
fi
|
||||||
|
|
@ -30,7 +41,7 @@ if [[ -z "$IP" ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Save to cache
|
# Save to cache for next time
|
||||||
mkdir -p "$(dirname "$CACHE")"
|
mkdir -p "$(dirname "$CACHE")"
|
||||||
grep -v "^${QUERY} " "$CACHE" > "${CACHE}.tmp" 2>/dev/null || true
|
grep -v "^${QUERY} " "$CACHE" > "${CACHE}.tmp" 2>/dev/null || true
|
||||||
echo "${QUERY} ${IP}" >> "${CACHE}.tmp"
|
echo "${QUERY} ${IP}" >> "${CACHE}.tmp"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue