3.7 KiB
Plan: skill spark-ssh para conectarse y ejecutar comandos en spark vía SSH
Contexto
El usuario quiere que Claude Code pueda operar directamente sobre su servidor "spark" (<<SPARK_IP_1>>) ejecutando comandos remotos vía SSH, sin tener que pedir manualmente la contraseña cada vez. Verificado en el entorno actual:
~/.ssh/configya tiene un hostsparkconfigurado (HostName <<SPARK_IP_1>>,User aleleba), pero la autenticación falla por key (ssh -o BatchMode=yes spark→Permission denied (publickey,password)) — spark solo acepta password.- La variable de entorno
SPARK_PASSWORDya existe en este entorno de desarrollo. sshpassno está instalado, pero está disponible víaapt(sshpass 1.09-1) y hay sudo sin password (sudo -n true→ OK), así que se puede instalar como parte del preflight de la skill./mnt/docker-nasno existe en este entorno de desarrollo — es un mount NFS que solo existe del lado de spark. Dentro de él,/mnt/docker-nas/projectses el mismo storage que~/projectsaquí. Es decir: un proyecto en~/projects/<nombre>en este entorno de desarrollo es exactamente/mnt/docker-nas/projects/<nombre>visto desde spark (mismo filesystem compartido vía NAS).
El objetivo es crear una skill global (en ~/.claude/skills/, siguiendo el patrón de las skills
existentes como web-ui-test, aleleba-pr) que documente el patrón de conexión y las convenciones de
seguridad/rutas para que Claude la use de forma consistente cada vez que el usuario pida ejecutar algo en
spark.
Archivo a crear
~/.claude/skills/spark-ssh/SKILL.md
Contenido de la skill
Frontmatter:
name: spark-sshdescription: explica que conecta a spark por SSH con password víaSPARK_PASSWORD, y que traduce rutas entre/mnt/docker-nas/projects(en spark) y~/projects(en este entorno). Incluye triggers en español: "conéctate a spark", "ejecuta esto en spark", "corre este comando en spark", "revisa spark".effort: lowargument-hint: "[comando o tarea a ejecutar en spark]"
Cuerpo (en español, consistente con el resto de skills del usuario):
-
Contexto fijo: host
sparkya está en~/.ssh/config; autenticación es por password (no key); password vive en$SPARK_PASSWORD; mapeo de rutas~/projects/<x>↔/mnt/docker-nas/projects/<x>. -
Preflight — instalar
sshpasssi falta (idempotente):which sshpass >/dev/null 2>&1 || sudo apt-get install -y sshpass -
Ejecutar un comando remoto, usando siempre
sshpass -e(nunca-p, que expone la password enps):SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark '<comando remoto>'Para comandos multilínea o con comillas complejas, usar heredoc remoto vía
ssh spark bash -s <<'EOF'. -
Regla de rutas compartidas: si el comando remoto opera sobre un proyecto que también existe localmente en
~/projects/<nombre>, la ruta equivalente en spark es/mnt/docker-nas/projects/<nombre>. Para editar código de esos proyectos, preferir las tools locales (Read/Edit) ya que es el mismo filesystem; usar SSH solo para ejecutar (builds, procesos, comandos específicos del entorno/hardware de spark). -
Seguridad: nunca imprimir/loggear
$SPARK_PASSWORD; aplicar las reglas generales de confirmación antes de comandos destructivos ejecutados en spark (rm -rf, docker rm, kill, etc.).
Verificación
Después de crear el archivo:
which sshpass >/dev/null 2>&1 || sudo apt-get install -y sshpass
SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark 'hostname && whoami && ls /mnt/docker-nas/projects | head -5'
Confirmar que devuelve el hostname de spark y que /mnt/docker-nas/projects lista el mismo contenido que
~/projects localmente.