È uscito il Corso Java Completo
Torna al blog

Cos'è SSH e come si usa per collegarsi a un server

Come funziona SSH, come ci si collega a un server, i comandi essenziali, il trasferimento file e gli errori più comuni di chi inizia.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

6 min di lettura

Se hai un server — un VPS, una macchina in cloud, un Raspberry Pi in salotto — SSH è il modo in cui ci parli. Non c'è schermo, non c'è mouse: c'è un terminale sulla tua macchina che esegue comandi su quella remota, come se fossi seduto davanti. In questo articolo trovi come funziona e come usarlo senza incidenti.

Cos'è

SSH (Secure Shell) è un protocollo che permette di eseguire comandi su una macchina remota attraverso un canale cifrato. Tutto ciò che scrivi e ricevi viaggia protetto.

È il successore di protocolli più vecchi che trasmettevano tutto in chiaro — password comprese — ed è il motivo per cui quelli non si usano più. Lo stesso ragionamento che faccio per FTP e SFTP.

Come ci si collega

ssh utente@indirizzo
ssh root@192.168.1.10
ssh edoardo@server.esempio.it -p 2222    # porta diversa dalla 22

La prima volta ricevi un avviso:

The authenticity of host '...' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting?

Non è un errore. SSH ti sta dicendo che non ha mai visto questo server e ti chiede di confermarne l'identità. Accettando, l'impronta viene salvata localmente.

Se in futuro quell'impronta cambia, SSH rifiuterà la connessione con un avviso allarmante. Quasi sempre è perché il server è stato reinstallato — ma è anche il meccanismo che segnala un tentativo di intercettazione, quindi vale la pena verificare invece di cancellare l'avviso per abitudine.

Per uscire: exit oppure Ctrl+D.

Le chiavi al posto della password

È la cosa più importante da configurare, ed è anche più comoda.

Con le chiavi ti colleghi senza digitare nulla, e la sicurezza è incomparabilmente superiore: una password si indovina con tentativi ripetuti, una chiave no.

In breve:

ssh-keygen -t ed25519 -C "la-tua-email"     # genera la coppia
ssh-copy-id utente@server                    # installa la pubblica sul server

Da lì in poi ssh utente@server entra direttamente.

Il funzionamento e la gestione meritano spazio proprio: sono in SSH e chiavi: guida completa.

Il file di configurazione

Questa è la comodità che quasi nessuno configura e che cambia la giornata.

In ~/.ssh/config:

Host mioserver
    HostName 192.168.1.10
    User edoardo
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Da quel momento basta:

ssh mioserver

Niente più indirizzi IP da ricordare, utenti da specificare, porte da digitare. E funziona anche con gli altri comandi che usano SSH, come la copia di file.

Trasferire file

scp file.txt utente@server:/percorso/          # locale → remoto
scp utente@server:/percorso/file.txt .         # remoto → locale
scp -r cartella/ utente@server:/percorso/      # ricorsivo

rsync -avz cartella/ utente@server:/percorso/  # sincronizza

rsync è nettamente migliore di scp per qualunque cosa non sia un file singolo: trasferisce solo le differenze, riprende da dove si era interrotto, e mostra l'avanzamento. Su una cartella di progetto la differenza di tempo è enorme.

Attenzione alla barra finale in rsync: cartella/ copia il contenuto, cartella copia la cartella stessa. È la fonte di confusione più comune.

Eseguire comandi senza entrare

ssh utente@server "df -h"                  # un comando e basta
ssh utente@server "systemctl restart nginx"

Utile negli script: non entri, esegui, esci. È anche il meccanismo dietro molti sistemi di deploy automatico.

Il tunnel SSH

Una funzione poco conosciuta e molto utile.

ssh -L 8080:localhost:80 utente@server

Questo rende il servizio in ascolto sulla porta 80 del server raggiungibile sulla porta 8080 della tua macchina.

Il caso d'uso concreto: un database o un pannello di amministrazione che gira sul server e non è esposto su internet — giustamente. Con un tunnel ci accedi dal tuo browser passando dal canale cifrato, senza aprire porte al mondo.

È il modo corretto di raggiungere servizi interni, molto meglio che esporli pubblicamente.

Restare connessi

Due fastidi comuni e i loro rimedi.

La connessione cade per inattività. Nel file di configurazione:

Host *
    ServerAliveInterval 60

Un comando lungo si interrompe se cade la connessione. La soluzione è un multiplexer di terminale — tmux o screen: la sessione continua sul server anche se ti disconnetti, e la ritrovi rientrando.

tmux              # avvia
# Ctrl+B poi D per staccarsi
tmux attach       # rientra

Per qualunque operazione che duri più di qualche minuto su un server, è la cosa giusta da fare. Un aggiornamento di sistema interrotto a metà da una connessione caduta è un problema serio.

Gli errori più comuni

"Permission denied (publickey)" — il server accetta solo chiavi e la tua non è installata, oppure stai usando l'utente sbagliato.

"Connection refused" — non c'è nessun servizio SSH in ascolto su quella porta: servizio spento, porta diversa, o firewall.

"Connection timed out" — il pacchetto non arriva: indirizzo sbagliato, firewall che scarta, macchina spenta.

"Host key verification failed" — l'impronta del server è cambiata. Verifica il perché prima di rimuoverla.

"WARNING: UNPROTECTED PRIVATE KEY FILE" — la tua chiave privata ha permessi troppo aperti. Va a 600, come spiego in permessi dei file Linux.

La sicurezza del server

Se gestisci tu la macchina, quattro accorgimenti che cambiano sostanzialmente la superficie di rischio:

Disattiva l'accesso con password, una volta configurate le chiavi. Elimina in un colpo l'intera categoria degli attacchi a tentativi ripetuti.

Disattiva l'accesso diretto come root. Si entra con un utente normale e si usa sudo.

Cambia la porta predefinita. Non è vera sicurezza — chi cerca davvero la trova — ma riduce drasticamente il rumore dei tentativi automatici nei log.

Installa uno strumento di blocco automatico che banna gli indirizzi dopo troppi tentativi falliti.

Il quadro più ampio è in come rendere un sito sicuro.

In sintesi

SSH esegue comandi su una macchina remota attraverso un canale cifrato. Ci si collega con ssh utente@indirizzo, e la prima volta si conferma l'identità del server.

Le due cose da configurare subito: le chiavi al posto della password — più sicure e più comode — e il file di configurazione, che trasforma indirizzi IP e porte in nomi brevi.

Per i file, rsync batte scp su qualunque cosa non sia un singolo file. Per le operazioni lunghe, tmux evita che una connessione caduta interrompa tutto.

E la funzione che quasi nessuno usa e che risolve un problema reale: il tunnel SSH, per raggiungere servizi interni al server senza esporli su internet.