Acquisito il 2026-07-28 da un CE di questa installazione. sitecli/capture-manifest.json
registra quale nodo, e scripts/capture-sitecli.sh --check riverifica la superficie
dei comandi su un CE attivo.
SSH raggiunge l’account admin dell’appliance, il cui shell di accesso è il Site CLI
(/opt/bin/vpmu). Questo è l’unico percorso verso la superficie completa dei comandi
sull’appliance — la debug API espone 34 comandi, mentre l’appliance
stessa ne offre molti altri che non sono disponibili su quella API.
Ogni parte di quella riga di comando è essenziale, e le prossime tre sezioni spiegano
quale errore previene ciascuna.
Non esiste un prompt di shell su cui atterrare: lo shell di accesso di adminè il
Site CLI, quindi si arriva al suo prompt >>>. Eseguire i comandi sull’appliance come
execcli <name> — vedere comandi sull’appliance.
admin_user_credentials.ssh_key sull’oggetto site sembra esattamente il campo adatto
a questo scopo. Viene accettato, sopravvive a una rilettura, e non configura nulla. vpm
gestisce gli utenti locali del nodo e si rifiuta di toccare questo — dal log del nodo
stesso, tre volte nell’arco di un singolo avvio:
vpm users.go:165: Won't do any change for user admin (internal skip)
Tutto il resto deriva da quella riga. /var/home/admin/.ssh non esiste mai, né prima
né dopo che il site raggiunge ONLINE. La data dell’ultimo cambio della shadow di admin
rimane alla data di build dell’immagine mentre vesbkp e vesopcon mostrano la data
corrente, perché vpm ha impostato quei due e saltato admin. E vpm non registra
nulla riguardo a ssh_key o authorized_keys in nessun momento.
Quindi il file deve essere scritto al di fuori di vpm. admin ha uid 2202, integrato
nell’immagine del nodo, quindi esiste prima che cloud-init venga eseguito e
owner: admin:admin si risolve al momento della scrittura — nessun runcmd, nessuna
correzione della proprietà:
- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}
sshd era sempre disponibile. sshd -T riporta pubkeyauthentication yes, e admin
appare in AllowUsers in entrambi i file sshd_config presenti sul nodo. Non c’era mai
nulla da abilitare — solo un file mancante.
sshd si associa a 0.0.0.0:22, ma solo l’indirizzo interno (SLI) è nello stack di
rete dell’host in modo che sshd risponda. eth0 viene rinominato a-i-eth0 e non porta
alcun IP host — il piano dati Argo possiede quell’interfaccia, e l’indirizzo di
management/SLO che avrebbe portato appare invece su vhost0. Le altre due NIC rimangono
nello stack dell’host con i propri nomi.
Sondato da una VM all’interno della VNet, contro un CE:
indirizzo management/SLO timeout
indirizzo esterno timeout
indirizzo interno/SLI APERTO SSH-2.0-OpenSSH_8.7
un indirizzo non utilizzato timeout (controllo)
Un sondaggio sull’indirizzo con cui si conosce il nodo restituisce quindi esattamente
quello che restituisce un security group chiuso. Non è nulla che lo blocchi; non c’è
alcun listener su quell’indirizzo.
Gli indirizzi pubblici del CE non hanno nessun listener sulla porta 22, motivo per cui il
comando sopra passa attraverso -J: una VM operatore all’interno della VNet, nella stessa
subnet degli indirizzi SLI. Questa installazione ne costruisce una allo scopo —
terraform output -raw client_vm_name la nomina.
Il Site CLI richiede un terminale e un carriage return
Lo shell di accesso di admin non è una shell. È un’applicazione go-prompt, che mette
il terminale in modalità raw e legge i tasti anziché le righe. Quattro conseguenze, ognuna
delle quali fallisce in un modo che sembra un problema diverso:
Meccanismo
Cosa succede senza di esso
Allocare un terminale (ssh -tt)
panic: no such device or address da go-prompt.NewStandardInputParser, che sembra un’appliance in crash
Inviare un carriage return, non un line feed, per Invio
La riga non viene mai inviata, e la sessione si chiude al termine dell’input senza aver stampato nulla
Mantenere aperto lo standard input
La connessione termina prima che il comando abbia prodotto output, quindi un comando funzionante sembra silenzioso
Scrivere il testo del comando e il byte Invio separatamente
Il newline finisce nel buffer come carattere letterale e il CLI risponde unknown command, il che sembra indicare che il comando non esista
ssh host 'some-command' quindi non funziona: l’argomento viene ignorato e il prompt
interattivo si avvia comunque. Utilizzarlo come terminale, o non utilizzarlo affatto.
scripts/sitecli_ssh_harvest.py è l’implementazione di riferimento.
Prima di digitare qualsiasi cosa, il banner di login ha già risposto a diverse domande su
cui si spenderebbero comandi. Da f5-xc-ce-vm-01, con ASCII art e IP pubblico rimossi:
Registration Status distingue un nodo ancora in avvio (PROVISIONING) da uno che ha
terminato (PROVISIONED). Software è la stringa di build che determina quali comandi
esistono. DNS e NTP coprono le due dipendenze che interrompono prima la registrazione,
quindi un nodo che non è mai andato online di solito ha già comunicato qui il motivo —
prima che chronyc-sources o
dig siano necessari.
Ognuno di questi è stato testato e scartato mentre il percorso era ancora ritenuto
impossibile. Ognuno è abbastanza plausibile da far perdere una giornata.
Non è la causa
Come è stato escluso
Le credenziali si applicano solo al momento della creazione
sshd si avvia circa 90 secondi nel primo avvio, prima che l’oggetto site esista. admin_user_credentials è anche presente in ReplaceSpecType e si applica in-place.
block_all_services
La chiusura della porta 22 sull’indirizzo di management è identica sia che i servizi siano bloccati o meno.
Un newline finale nella chiave
Testato in entrambi i modi, nessuna modifica. Cloud-init lo elimina comunque, perché un blocco letterale altrimenti renderebbe una seconda riga vuota.
Software CE pinnato e più vecchio
Riprodotto su tre build, inclusa una con OpenSSH 9.9.
Un admin_password mancante
Impostare admin_password insieme a ssh_key su un CE da zero non ha cambiato nulla.
Debug APIBasata su script, non richiede accesso all'interno della VNet, ed è la scelta giusta per evidenze ripetibili. Copre 34 comandi e richiede che il site sia ONLINE.
Site ConsoleUI di troubleshooting del nodo F5 tramite tunnel Azure Bastion. Nessuna chiave, nessun jump host, e risponde prima che il site si registri.
Serial consolePer un nodo che non si è mai registrato, o non ha un percorso di rete funzionante. Richiede un terminale, o il harness websocket.