Il PC lo prepara Claude, su Windows o Mac

Chi arriva installa Claude e gli scrive una frase: i programmi li installa
l'assistente (winget o Homebrew). configura.sh chiede la password Gitea e
crea da solo il token, salva la chiave AWS senza aws configure e carica la
chiave SSH pubblica sul profilo Gitea, da dove la prende l'amministratore.
verifica.sh non usa piu' timeout, che sul Mac non c'e'. Il repository e'
pubblico: non ha segreti.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Fabio
2026-09-30 19:19:13 +02:00
co-authored by Claude Opus 5.5
parent 059a23e76e
commit 8008b84bfb
4 changed files with 184 additions and 110 deletions
+81 -51
View File
@@ -1,82 +1,112 @@
# Istruzioni per Claude: preparare il PC di chi arriva # Istruzioni per Claude: preparare il PC di chi arriva
Chi apre questo repository è una persona **nuova in OTO**, spesso non Chi ti parla è una persona **nuova in OTO**, spesso non tecnica, al primo
tecnica, al primo giorno. Il tuo compito: portarla da "ho solo le password giorno. Ti ha scritto qualcosa come «prepara il mio PC per OTO» e ha in mano
provvisorie" a "`./verifica.sh` è tutto verde e ho scaricato i miei solo le password provvisorie che le ha mandato l'amministratore. **Il lavoro
progetti". Parla semplice, un passo alla volta, e controlla ogni passo prima lo fai tu**: installi i programmi, lanci i controlli, le dici cosa cliccare.
di passare al successivo. Lei fa solo quello che tu non puoi fare: i login nel browser, e scrivere i
propri segreti nel terminale. Parla semplice, un passo alla volta, e controlla
ogni passo prima del successivo.
La spiegazione per le persone sta in La spiegazione per le persone sta in
`https://servizi.oto-farm.com/nuovo-collaboratore.html`: non contraddirla. `https://servizi.oto-farm.com/nuovo-collaboratore.html`: non contraddirla.
## Regole che non si negoziano ## Regole che non si negoziano
1. **Mai un segreto in chat.** Token Gitea, chiave e segreto AWS, password, 1. **Mai un segreto in chat.** Password, chiavi AWS, token, chiavi private:
chiavi private: non chiederli e, se la persona li incolla, dille di non chiederli. Se la persona ne incolla uno, dille di cambiarlo (una
rigenerarli (un token finito in chat va considerato esposto). I segreti password finita in chat va considerata esposta). I segreti li chiede
li chiede `configura.sh` nel terminale, con l'input nascosto. `configura.sh` nel terminale, con l'input nascosto.
2. **Gli script che chiedono qualcosa li lancia la persona**, in un suo 2. **`configura.sh` lo lancia la persona**, in un terminale suo: tu non puoi
terminale, non tu: tu non puoi rispondere al posto suo a un prompt rispondere a un prompt nascosto. Diglielo con le parole giuste per dove
nascosto. Tu lanci solo `./verifica.sh` e i comandi di sola lettura. lavora (vedi sotto). Tu lanci tutto il resto: installazioni, `verifica.sh`,
3. **Non creare accessi e non chiederli.** Utenti AWS, utenti Gitea, VPN, `progetti.sh`, i comandi di sola lettura.
chiavi sui server li crea un amministratore (con gli script di `_OTO_IT`). 3. **Non creare accessi e non chiederli.** Utenti AWS e Gitea, VPN, chiavi
Se manca qualcosa, dillo con precisione ("serve che l'amministratore ti sui server li crea un amministratore. Se manca qualcosa, dillo con
aggiunga al repository X") e vai avanti col resto. precisione ("serve che l'amministratore ti aggiunga al progetto X") e vai
avanti col resto.
4. **Un "accesso negato" di AWS non è un guasto**: è il ruolo della persona. 4. **Un "accesso negato" di AWS non è un guasto**: è il ruolo della persona.
Lo dici e prosegui. Lo dici e prosegui.
5. **Non copiare file da altri PC** e non proporlo: se a un progetto manca un 5. **Non copiare file da altri PC** e non proporlo: se a un progetto manca un
segreto, va messo su AWS SSM da un amministratore. segreto, va messo su AWS SSM da un amministratore.
## Prima domanda: qual è il suo caso ## Dove sei
Chiedilo subito, con parole semplici, perché cambia quanti passi servono: - **Visual Studio Code con l'estensione Claude Code**, oppure **l'app Claude
nella scheda Code**: lavori sul PC vero, puoi installare. Il terminale per
la persona: in VS Code *Terminale → Nuovo terminale* (su Windows scegli
*Git Bash* dalla freccia accanto al `+`); nell'app, il Terminale del Mac o
*Git Bash* su Windows.
- **Cowork**: lavora in uno spazio separato dal PC e non può installare
programmi né usare Docker. Diglielo e falle aprire VS Code o la scheda Code.
Capisci da solo se sei su Windows o su Mac (`uname -s`, `$OS`): non chiederlo.
## Prima domanda: qual è il suo caso
- **modifica testi e immagini solo dal pannello** (o dall'area di - **modifica testi e immagini solo dal pannello** (o dall'area di
amministrazione di WordPress/Drupal): non le serve niente di questo amministrazione di WordPress/Drupal): non le serve niente di questo
repository. Diglielo e fermati: le basta l'utente del pannello. repository. Diglielo e fermati.
- **crea o modifica pagine con Claude, senza scrivere codice**: servono AWS, - **crea o modifica pagine con Claude, senza scrivere codice**: tutti i passi
Gitea e Claude. **Salta VPN e chiave SSH** (passi 5 e 6): servono solo per **tranne VPN** (passo 5). `verifica.sh` segnerà rossi VPN e staging: dille
pubblicare siti Drupal o WordPress. `verifica.sh` segnerà rossi VPN e SSH: che per lei è normale.
dille che per lei è normale.
- **sviluppa**: tutti i passi. - **sviluppa**: tutti i passi.
Con chi non sviluppa niente gergo: se una parola tecnica serve (token, Con chi non sviluppa niente gergo: se una parola tecnica serve (terminale,
terminale, push), spiegala in una riga la prima volta che la usi. token, push), spiegala in una riga la prima volta.
## L'ordine ## L'ordine
1. **Programmi**: `./verifica.sh` dice cosa manca tra git, Docker, AWS CLI. 1. **Programmi.** Servono git, la AWS CLI, Docker, curl e ssh. Installa
Guida l'installazione per il sistema della persona (Linux, macOS o quello che manca:
Windows con WSL). - **Windows**: `winget install -e --id Git.Git`, `Amazon.AWSCLI`,
2. **AWS**, nel browser: entrare nella console con la password provvisoria, `Docker.DockerDesktop`. Docker vuole WSL2: `wsl --install`, poi un
sceglierne una nuova, attivare l'MFA, poi *nome in alto a destra → riavvio. Windows chiederà conferma (finestra *Sì/No*): avvisa prima che
Security credentials → Create access key* (uso: CLI). Poi nel terminale arriva e che va cliccato *Sì*. Dopo un'installazione il `PATH` nuovo lo
`aws configure`, con regione `eu-central-1`. Controllo: vede solo un terminale nuovo.
`aws sts get-caller-identity` deve mostrare `nome.cognome`. - **Mac**: prima Homebrew. Il suo installatore chiede la password del Mac,
3. **Gitea**, nel browser: cambiare la password provvisoria, poi quindi quel comando lo lancia la persona nel Terminale:
*Impostazioni → Applicazioni → Genera token* con permesso di scrittura `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`.
sui repository. Poi tu: `brew install git awscli` e `brew install --cask docker`.
4. **`./configura.sh`**, nel terminale della persona: salva il token Gitea, - Docker Desktop va **aperto una volta** a mano e le condizioni accettate:
configura git, genera la chiave SSH, scrive i nomi dei server in finché non lo si fa, `docker info` non risponde.
`~/.ssh/config`. 2. **Questo repository sul PC**, se ci stai parlando da un link e non da
5. **La chiave SSH pubblica**: `configura.sh` la stampa. La persona la manda dentro la cartella: `git clone https://git.oto-farm.com/admin/_OTO_IT_onboard.git
all'amministratore (si può mandare in chat: è la parte pubblica). Ribadisci ~/Work/workspace/oto/_OTO_IT_onboard` (è pubblico, non ha segreti) e da lì
che il file **senza** `.pub` non esce dal PC. continui.
6. **VPN**: importare il file ricevuto (Linux: *Impostazioni → Rete → VPN → 3. **I login nel browser**, li fa lei:
+ → Importa da file*). - **AWS** (indirizzo e password provvisoria nel messaggio dell'amministratore):
scegliere la password nuova, attivare l'MFA (*il suo nome in alto a destra
→ Security credentials → Assign MFA device*, con un'app sul telefono), poi
nella stessa pagina *Create access key*, uso *Command Line Interface*.
**Lasciare aperta la pagina**: la chiave segreta si vede una volta sola.
- **Gitea** (`https://git.oto-farm.com`): entrare con la password provvisoria
e sceglierne una nuova. Nient'altro: il token lo crea lo script.
4. **`./configura.sh`**, nel terminale della persona. Chiede i due pezzi della
chiave AWS e utente e password di Gitea; crea l'accesso a Gitea, configura
git, genera la chiave SSH e la carica sul suo profilo Gitea (da lì la
prende l'amministratore: **non va mandata a nessuno**), scrive i nomi dei
server in `~/.ssh/config`. Poi fa chiudere la pagina di AWS.
5. **VPN** (solo chi sviluppa): installare il client e importare il file
arrivato dal fornitore.
6. **Dirlo all'amministratore**: «ho finito la configurazione». È il segnale
per mettere la sua chiave SSH sui server; finché non lo fa, staging resta
rosso.
7. **`./verifica.sh`**: tutto verde, o un elenco preciso di cosa manca e a chi 7. **`./verifica.sh`**: tutto verde, o un elenco preciso di cosa manca e a chi
chiederlo. chiederlo.
8. **`./progetti.sh`**: scarica i progetti che la persona vede su Gitea. 8. **`./progetti.sh`**: scarica i progetti che la persona vede su Gitea (lo
Poi, in ogni progetto: `./start.sh` per i progetti con pannello, lanci tu con i nomi: `./progetti.sh nome1 nome2`). Poi, in ogni progetto:
`bin/local-init.sh` per Drupal e WordPress. Il resto lo spiega il `./start.sh` per i progetti con pannello, `bin/local-init.sh` per Drupal e
`CLAUDE.md` di quel progetto. WordPress. Il resto lo spiega il `CLAUDE.md` di quel progetto.
## Stato al 29/09/2026: cosa non è ancora pronto ## Stato al 30/09/2026: cosa non è ancora pronto
Dillo alla persona, invece di farle scoprire un rosso inspiegabile: Dillo alla persona, invece di farle scoprire un rosso inspiegabile:
- **le chiavi SSH personali non sono ancora installate sui server**: il - **questo percorso non è ancora stato fatto da nessuno su Windows o su Mac**:
controllo SSH resterà rosso finché l'amministratore non aggiunge la sua; gli script sono bash (su Windows girano in Git Bash) e sono stati provati su
Linux. Se qualcosa non va, scrivi con precisione cosa è successo: serve per
correggerlo;
- **alcuni progetti non hanno ancora tutti i segreti su SSM**: in locale - **alcuni progetti non hanno ancora tutti i segreti su SSM**: in locale
qualcosa può mancare; qualcosa può mancare;
- la produzione nuova non esiste ancora: in `~/.ssh/config` c'è quella vecchia. - la produzione nuova non esiste ancora: in `~/.ssh/config` c'è quella vecchia.
+21 -33
View File
@@ -1,36 +1,30 @@
# Primo giorno in OTO: preparare il PC # Primo giorno in OTO: preparare il PC
Questo repository serve una volta sola: prepara il tuo PC per lavorare sui Questo repository serve una volta sola: prepara il tuo PC per lavorare sui
progetti OTO. Non contiene segreti. I segreti dei progetti li scaricano i progetti OTO. È pubblico e non contiene segreti: i segreti dei progetti li
progetti stessi da AWS, con il tuo accesso personale. scaricano i progetti stessi da AWS, con il tuo accesso personale.
La spiegazione completa (cosa sono i quattro accessi, chi li crea, cosa fai
quando qualcuno se ne va) è sul portale dei servizi, alla voce **Chi arriva →
Accessi e primo giorno**: `https://servizi.oto-farm.com/nuovo-collaboratore.html`.
## Prima di iniziare ti servono
Te li manda l'amministratore:
- la **password provvisoria di AWS** (utente `nome.cognome`);
- la **password provvisoria di Gitea**, con cui hai scaricato questo repository;
- il **file della VPN**, che arriva dal fornitore della VPN.
Sul PC ti servono installati **git**, **Docker**, la **AWS CLI** e
**Claude Code**.
## Come si usa ## Come si usa
```bash 1. Installa **Visual Studio Code** e, dentro, l'estensione **Claude Code**
git clone https://git.oto-farm.com/admin/_OTO_IT_onboard.git (oppure l'app **Claude**, scheda *Code*). Entra con l'invito di Claude.
cd _OTO_IT_onboard 2. Scrivi a Claude:
claude
```
e a Claude scrivi: **«configura la mia postazione»**. Ti guida passo per passo > Prepara il mio PC per OTO: https://git.oto-farm.com/admin/_OTO_IT_onboard
e controlla ogni passo.
Se preferisci fare da solo: Il resto lo fa Claude: installa i programmi e ti dice cosa cliccare. Tu fai i
login nel browser e scrivi le tue chiavi nel terminale quando te lo chiede.
## Una regola
**Password, chiavi e token non si scrivono mai in chat, nemmeno a Claude.**
Quando serve un segreto, `configura.sh` lo chiede nel terminale senza
mostrarlo a schermo.
La spiegazione completa è su
`https://servizi.oto-farm.com/nuovo-collaboratore.html`.
## Senza Claude
```bash ```bash
./configura.sh # chiede quello che serve, una cosa per volta ./configura.sh # chiede quello che serve, una cosa per volta
@@ -38,11 +32,5 @@ Se preferisci fare da solo:
./progetti.sh # scarica i progetti a cui hai accesso ./progetti.sh # scarica i progetti a cui hai accesso
``` ```
Puoi rilanciarli quante volte vuoi: quello che è già a posto non viene Si possono rilanciare quante volte si vuole: quello che è già a posto non
toccato. viene toccato.
## Una regola
**Token, password e chiavi private non si scrivono mai in chat, nemmeno a
Claude.** Quando serve un segreto, `configura.sh` lo chiede nel terminale senza
mostrarlo a schermo.
+73 -24
View File
@@ -1,11 +1,12 @@
#!/bin/bash #!/bin/bash
# #
# PREPARA IL PC: token Gitea, git, chiave SSH, nomi dei server. # PREPARA IL PC: accesso AWS, accesso Gitea, git, chiave SSH, nomi dei server.
# #
# ./configura.sh # ./configura.sh
# #
# Si lancia nel proprio terminale (chiede il token Gitea con l'input # Si lancia nel proprio terminale: chiede le chiavi AWS e la password Gitea
# nascosto). Si puo' rilanciare: quello che e' gia' a posto non viene toccato. # con l'input nascosto, e un assistente AI non puo' rispondere al posto tuo.
# Si puo' rilanciare: quello che e' gia' a posto non viene toccato.
# Non crea accessi: quelli li crea un amministratore, qui si usano. # Non crea accessi: quelli li crea un amministratore, qui si usano.
set -u set -u
@@ -15,36 +16,70 @@ cd "$(dirname "$0")" || exit 1
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
titolo "1. AWS" titolo "1. AWS"
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# La chiave di accesso la crea la persona dalla console (Security
# credentials → Create access key): qui la si incolla una volta e finisce in
# ~/.aws/credentials, dove la leggono la AWS CLI e gli script dei progetti.
if ! c_e aws ; then if ! c_e aws ; then
male "AWS CLI non installata: installala e rilancia questo script." male "AWS CLI non installata: installala e rilancia questo script."
elif IDENTITA="$(aws sts get-caller-identity --query Arn --output text 2> /dev/null)" ; then elif IDENTITA="$(aws sts get-caller-identity --query Arn --output text 2> /dev/null)" ; then
ok "accesso AWS: ${IDENTITA##*/}" ok "accesso AWS: ${IDENTITA##*/}"
else else
attento "AWS non ancora configurato. Nel terminale:" echo " Serve la tua chiave di accesso AWS, due pezzi. La crei nella console AWS:"
echo " aws configure (regione: $AWS_REGIONE)" echo " il tuo nome in alto a destra → Security credentials → Create access key (uso: CLI)."
echo " con la chiave che crei dalla console AWS (Security credentials)." echo " Non si vede mentre la incolli, ed e' normale."
read -r -s -p " Access key ID (inizia con AKIA): " CHIAVE_ID ; echo
read -r -s -p " Secret access key: " CHIAVE_SEGRETA ; echo
CHIAVE_ID="$(printf '%s' "$CHIAVE_ID" | tr -d '[:space:]')"
CHIAVE_SEGRETA="$(printf '%s' "$CHIAVE_SEGRETA" | tr -d '[:space:]')"
aws configure set aws_access_key_id "$CHIAVE_ID"
aws configure set aws_secret_access_key "$CHIAVE_SEGRETA"
aws configure set region "$AWS_REGIONE"
unset CHIAVE_SEGRETA
if IDENTITA="$(aws sts get-caller-identity --query Arn --output text 2> /dev/null)" ; then
ok "accesso AWS: ${IDENTITA##*/}"
else
male "AWS non accetta questa chiave: controlla di aver copiato i due pezzi interi, o creane un'altra."
fi
fi fi
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
titolo "2. Gitea" titolo "2. Gitea"
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Alla persona si chiede la password, non un token: il token lo crea lo
# script con l'API di Gitea, cosi' non c'e' da cercarlo fra le impostazioni.
# Gitea rifiuta la password provvisoria finche' non la si cambia nel browser.
UTENTE="$(utente_gitea)" UTENTE="$(utente_gitea)"
if [ -n "$UTENTE" ] ; then if [ -n "$UTENTE" ] ; then
ok "token Gitea gia' salvato (utente $UTENTE)" ok "token Gitea gia' salvato (utente $UTENTE)"
else else
echo " Incolla il token Gitea (Impostazioni → Applicazioni → Genera token)." echo " Se non l'hai ancora fatto, entra su $GITEA_URL e cambia la password provvisoria."
echo " Non si vede mentre lo incolli, ed e' normale." read -r -p " Il tuo utente Gitea (nome.cognome): " UTENTE_DATO
read -r -s -p " Token: " TOKEN ; echo read -r -s -p " La tua password Gitea (non si vede, ed e' normale): " PASSWORD ; echo
TOKEN="$(printf '%s' "$TOKEN" | tr -d '[:space:]')" # utente:password passano a curl da stdin, non dalla riga di comando
mkdir -p "$(dirname "$TOKEN_GITEA_FILE")" # (che chiunque sul PC vede con ps). Virgolette e \ vanno protette.
chmod 700 "$(dirname "$TOKEN_GITEA_FILE")" PASSWORD_CURL="$(printf '%s:%s' "$UTENTE_DATO" "$PASSWORD" | sed 's/[\\"]/\\&/g')"
( umask 077 ; printf '%s\n' "$TOKEN" > "$TOKEN_GITEA_FILE" ) NOME_TOKEN="oto-$(hostname | tr -dc 'A-Za-z0-9-' | head -c 20)-$(date +%Y%m%d%H%M%S)"
UTENTE="$(utente_gitea)" RISPOSTA="$(printf 'user = "%s"\n' "$PASSWORD_CURL" \
if [ -n "$UTENTE" ] ; then | curl -s --max-time 15 -K - -w '\n%{http_code}' -X POST \
ok "token valido, salvato in $TOKEN_GITEA_FILE (utente $UTENTE)" -H 'Content-Type: application/json' \
-d "{\"name\":\"$NOME_TOKEN\",\"scopes\":[\"write:repository\",\"write:user\",\"read:organization\"]}" \
"$GITEA_URL/api/v1/users/$UTENTE_DATO/tokens")"
unset PASSWORD PASSWORD_CURL
CODICE="${RISPOSTA##*$'\n'}"
TOKEN="$(printf '%s' "${RISPOSTA%$'\n'*}" | sed -n 's/.*"sha1":"\([^"]*\)".*/\1/p')"
if [ "$CODICE" = "201" ] && [ -n "$TOKEN" ] ; then
mkdir -p "$(dirname "$TOKEN_GITEA_FILE")"
chmod 700 "$(dirname "$TOKEN_GITEA_FILE")"
( umask 077 ; printf '%s\n' "$TOKEN" > "$TOKEN_GITEA_FILE" )
unset TOKEN
UTENTE="$(utente_gitea)"
ok "accesso Gitea salvato in $TOKEN_GITEA_FILE (utente $UTENTE)"
elif [ "$CODICE" = "403" ] ; then
male "Gitea chiede prima di cambiare la password provvisoria: entra su $GITEA_URL, cambiala e rilancia."
elif [ "$CODICE" = "401" ] ; then
male "utente o password sbagliati: rilancia e riprova."
else else
rm -f "$TOKEN_GITEA_FILE" male "Gitea non ha creato l'accesso (HTTP ${CODICE:-nessuna risposta}): rilancia, o chiedi all'amministratore."
male "Gitea non accetta questo token: controlla di averlo copiato intero, o generane un altro."
fi fi
fi fi
@@ -75,12 +110,26 @@ else
ssh-keygen -q -t ed25519 -f "$CHIAVE_SSH" -C "$COMMENTO" -N "" \ ssh-keygen -q -t ed25519 -f "$CHIAVE_SSH" -C "$COMMENTO" -N "" \
&& ok "chiave creata: $CHIAVE_SSH" && ok "chiave creata: $CHIAVE_SSH"
fi fi
if [ -f "$CHIAVE_SSH.pub" ] ; then # La parte pubblica va sul proprio profilo Gitea: e' da li' che
echo # l'amministratore la prende per metterla sui server, senza che la persona
echo " Manda all'amministratore QUESTA riga (e' la parte pubblica, si puo' mandare in chat):" # debba mandarla a nessuno.
echo if [ -f "$CHIAVE_SSH.pub" ] && [ -n "$UTENTE" ] ; then
echo " $(cat "$CHIAVE_SSH.pub")" PUBBLICA="$(awk '{print $1" "$2}' "$CHIAVE_SSH.pub")"
echo if curl -s --max-time 10 -H "Authorization: token $(token_gitea)" "$GITEA_URL/api/v1/user/keys" \
| grep -qF "${PUBBLICA#* }" ; then
ok "chiave pubblica gia' sul tuo profilo Gitea"
else
CODICE="$(curl -s -o /dev/null --max-time 10 -w '%{http_code}' -X POST \
-H "Authorization: token $(token_gitea)" -H 'Content-Type: application/json' \
-d "{\"title\":\"oto $(hostname | tr -dc 'A-Za-z0-9-')\",\"key\":\"$PUBBLICA\"}" \
"$GITEA_URL/api/v1/user/keys")"
if [ "$CODICE" = "201" ] ; then
ok "chiave pubblica caricata sul tuo profilo Gitea: l'amministratore la prende da li'"
else
attento "non riesco a caricare la chiave su Gitea (HTTP $CODICE). Manda all'amministratore questa riga, e' la parte pubblica:"
echo " $(cat "$CHIAVE_SSH.pub")"
fi
fi
echo " Il file $CHIAVE_SSH, senza .pub, non esce mai da questo PC." echo " Il file $CHIAVE_SSH, senza .pub, non esce mai da questo PC."
fi fi
+9 -2
View File
@@ -54,8 +54,15 @@ if [ -f "$CHIAVE_SSH" ] ; then ok "$CHIAVE_SSH" ; else rosso "chiave mancante: r
titolo "VPN e server" titolo "VPN e server"
# La VPN si riconosce da una cosa sola: staging, che sta su rete privata, # La VPN si riconosce da una cosa sola: staging, che sta su rete privata,
# risponde sulla porta SSH. # risponde sulla porta SSH. Niente `timeout`: sul Mac non c'e'.
if timeout 5 bash -c "exec 3<>/dev/tcp/$STAGING_HOST/22" 2> /dev/null ; then porta_aperta () {
bash -c "exec 3<>/dev/tcp/$1/$2" 2> /dev/null & local pid=$!
( sleep 5 ; kill "$pid" 2> /dev/null ) & local sveglia=$!
wait "$pid" 2> /dev/null ; local esito=$?
kill "$sveglia" 2> /dev/null
return "$esito"
}
if porta_aperta "$STAGING_HOST" 22 ; then
ok "VPN attiva (staging raggiungibile)" ok "VPN attiva (staging raggiungibile)"
if ssh -o BatchMode=yes -o ConnectTimeout=8 "$STAGING_NOME" true 2> /dev/null ; then if ssh -o BatchMode=yes -o ConnectTimeout=8 "$STAGING_NOME" true 2> /dev/null ; then
ok "entri su staging ($STAGING_NOME)" ok "entri su staging ($STAGING_NOME)"