Ir al contenido

SSH

Capturado el 28-07-2026 desde un CE de este despliegue. sitecli/capture-manifest.json registra qué nodo, y scripts/capture-sitecli.sh --check vuelve a verificar la superficie de comandos contra un CE activo.

SSH llega a la cuenta admin del appliance, cuyo shell de inicio de sesión es el Site CLI (/opt/bin/vpmu). Esta es la única ruta a la superficie completa de comandos en la caja — la API de depuración expone 34 comandos, y el appliance en sí ofrece muchos más que no están en esa API en absoluto.

Ventana de terminal
cd terraform
SLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')
ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"

Cada parte de esa línea de comandos es fundamental, y las tres secciones siguientes explican qué fallo previene cada una.

No hay prompt de shell al que llegar: el shell de inicio de sesión de admin es el Site CLI, por lo que se llega a su prompt >>>. Ejecute los comandos en la caja como execcli <name> allí — consulte comandos en la caja.

Por qué cloud-init escribe la clave, y no la API

Sección titulada «Por qué cloud-init escribe la clave, y no la API»

admin_user_credentials.ssh_key en el objeto del sitio parece exactamente el campo para esto. Se acepta, sobrevive a una lectura de vuelta, y no configura nada. vpm posee los usuarios locales del nodo y declina tocar este — desde el propio log del nodo, tres veces durante un solo arranque:

vpm users.go:165: Won't do any change for user admin (internal skip)

Todo lo demás se deriva de esa línea. /var/home/admin/.ssh nunca existe, antes ni después de que el sitio alcance ONLINE. La fecha de último cambio de la contraseña shadow de admin permanece en la fecha de construcción de la imagen mientras vesbkp y vesopcon muestran la fecha actual, porque vpm configuró esos dos y omitió admin. Y vpm no registra nada sobre ssh_key o authorized_keys en ningún momento.

Por lo tanto, el archivo debe escribirse fuera de vpm. admin es uid 2202, integrado en la imagen del nodo, por lo que existe antes de que cloud-init se ejecute y owner: admin:admin se resuelve en el momento de la escritura — sin runcmd, sin corrección de propiedad:

- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}

sshd siempre estuvo dispuesto. sshd -T reporta pubkeyauthentication yes, y admin aparece en AllowUsers en ambos archivos sshd_config que vienen en el nodo. Nunca hubo nada que habilitar — solo un archivo faltante.

sshd se enlaza a 0.0.0.0:22, pero solo la dirección interna (SLI) está en la pila de red del host de una forma en que sshd responderá. eth0 se renombra a-i-eth0 y no lleva ninguna IP de host en absoluto — el plano de datos Argo posee esa interfaz, y la dirección de gestión/SLO que habría llevado aparece en vhost0 en su lugar. Las otras dos NICs permanecen en la pila del host bajo sus propios nombres.

Sondeado desde una VM dentro de la VNet, contra un CE:

dirección de gestión/SLO tiempo agotado
dirección externa tiempo agotado
dirección interna/SLI ABIERTO SSH-2.0-OpenSSH_8.7
una dirección no utilizada tiempo agotado (control)

Un sondeo contra la dirección por la que conoce el nodo, por tanto, devuelve exactamente lo que devuelve un grupo de seguridad cerrado. Nada lo está bloqueando; no hay listener en esa dirección.

Las direcciones públicas del CE no tienen listener en el puerto 22 tampoco, que es por qué el comando anterior pasa por -J: una VM de operador dentro de la VNet, en la misma subred que las direcciones SLI. Este despliegue construye una para ese propósito — terraform output -raw client_vm_name la nombra.

El Site CLI necesita un terminal y un retorno de carro

Sección titulada «El Site CLI necesita un terminal y un retorno de carro»

El shell de inicio de sesión de admin no es un shell. Es una aplicación go-prompt, que pone el terminal en modo raw y lee pulsaciones de teclas en lugar de líneas. Cuatro consecuencias, cada una de las cuales falla de una manera que parece un problema diferente:

MecánicaQué ocurre sin ella
Asignar un terminal (ssh -tt)panic: no such device or address de go-prompt.NewStandardInputParser, que se lee como un appliance caído
Enviar un retorno de carro, no un salto de línea, para EnterLa línea nunca se envía, y la sesión se cierra al final de la entrada sin haber impreso nada
Mantener la entrada estándar abiertaLa conexión termina antes de que el comando se haya renderizado, por lo que un comando que funciona parece silencioso
Escribir el texto del comando y el byte Enter por separadoEl salto de línea aterriza en el búfer como un carácter literal y la CLI responde unknown command, lo que se lee como si el comando no existiera

ssh host 'some-command' por tanto no funciona: el argumento es ignorado y el prompt interactivo comienza de todas formas. Manéjelo como un terminal o no lo haga en absoluto. scripts/sitecli_ssh_harvest.py es la implementación de referencia.

El banner es una verificación de salud gratuita

Sección titulada «El banner es una verificación de salud gratuita»

Antes de escribir nada, el banner de inicio de sesión ya ha respondido varias de las preguntas en las que de otro modo gastaría comandos. Desde f5-xc-ce-vm-01, arte ASCII e IP pública omitidos:

UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED
All actions performed on this device are audited
Using https://register.ves.volterra.io
OS: rhel-9.2024.6
Memory: 32768MiB
Storage: sda: 31GiB
CPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8
Software: crt-20250613-3382
DNS: 168.63.129.16: OK
NTP: Synced
Uptime: 0 days, 5 hours, 20 minutes
Registration Status: PROVISIONED
SLO IP: 10.0.1.4/26
WELCOME IN SITE CLI

Registration Status distingue un nodo que todavía está levantándose (PROVISIONING) de uno que ha terminado (PROVISIONED). Software es la cadena de construcción que determina qué comandos existen. DNS y NTP cubren las dos dependencias que rompen el registro primero, por lo que un nodo que nunca se conectó normalmente ya le ha dicho por qué aquí — antes de que se necesiten chronyc-sources o dig.

  1. Genere un par de claves, si aún no tiene uno. Ed25519 en lugar de RSA: más corto, y aceptado por el sshd del appliance.

    Ventana de terminal
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. Apunte el despliegue hacia la mitad pública. El módulo raíz lee el archivo una vez y pasa la cadena hacia abajo a cada nodo:

    terraform/terraform.tfvars
    ssh_public_key_path = "~/.ssh/id_ed25519.pub"

    ssh_public_key toma el material en línea en su lugar, que es lo que usan las pruebas del plan. La mitad privada nunca sale de su estación de trabajo.

  3. Aplique. Lea la advertencia al principio de esta página primero — en un despliegue existente esto reemplaza las VMs CE.

Cada uno de estos fue probado y descartado mientras la ruta todavía se creía imposible. Cada uno es lo suficientemente plausible como para costar un día.

No es la causaCómo fue descartado
La credencial solo se aplica en el momento de la creaciónsshd arranca aproximadamente 90 segundos después del primer arranque, antes de que exista el objeto del sitio. admin_user_credentials también está presente en ReplaceSpecType y se aplica en sitio.
block_all_servicesEl cierre del puerto 22 en la dirección de gestión es idéntico ya sea que los servicios estén bloqueados o no.
Un salto de línea al final de la claveProbado de ambas formas, sin cambios. Cloud-init de todas formas lo elimina, porque un bloque literal de otro modo renderizaría una segunda línea vacía.
Software CE antiguo, fijadoReproducido en tres construcciones, incluida una con OpenSSH 9.9.
Un admin_password faltanteConfigurar admin_password junto con ssh_key en un CE desde cero no cambió nada.