Comandi SSH Essenziali per Amministratori di Sistema
Impara i comandi SSH essenziali per accesso remoto, chiavi, file di configurazione, trasferimento file, tunneling, agenti e risoluzione dei problemi.
Comandi SSH Essenziali per Amministratori di Sistema
Secure Shell (SSH) è lo strumento di accesso remoto quotidiano per server e dispositivi di rete. Se gestisci sistemi Linux, usi i comandi SSH per accedere, copiare file, eseguire comandi singoli, aprire tunnel e diagnosticare errori di connessione.
Questa guida si concentra sui comandi e le opzioni che probabilmente ti serviranno durante il lavoro di amministrazione reale.
Stabilire Connessioni SSH di Base
L'uso più fondamentale di SSH è stabilire una sessione shell interattiva e sicura con un server remoto. La sintassi di base è semplice e ti permette di specificare l'utente e l'host di destinazione.
Connessione a un Server Remoto
Per connetterti a un server remoto usando il tuo nome utente locale corrente:
ssh nome_host_o_indirizzo_IP
Se il tuo nome utente sul server remoto è diverso dal tuo nome utente locale, devi specificarlo:
ssh nome_utente@nome_host_o_indirizzo_IP
Esempio:
ssh [email protected]
ssh [email protected]
Specificare una Porta Personalizzata
Di default, SSH utilizza la porta 22. Tuttavia, per motivi di sicurezza o configurazioni di rete specifiche, i server spesso ascoltano su una porta diversa. Puoi specificare una porta personalizzata usando il flag -p:
ssh -p 2222 nome_utente@nome_host_o_indirizzo_IP
Consiglio: Cambiare la porta SSH predefinita (porta 22) è una pratica di sicurezza comune per ridurre i tentativi di attacco automatizzati, anche se non sostituisce un'autenticazione forte.
Autenticazione Basata su Chiave SSH
Mentre l'autenticazione tramite password è comune, l'autenticazione basata su chiave è il metodo consigliato e più sicuro per SSH. Utilizza una coppia di chiavi crittografiche: una chiave privata (tenuta segreta sulla tua macchina locale) e una chiave pubblica (posizionata sul server remoto).
Generare Coppie di Chiavi SSH
Usa ssh-keygen per generare una nuova coppia di chiavi. Per la maggior parte delle configurazioni OpenSSH moderne, le chiavi Ed25519 sono una buona scelta predefinita. Usa RSA solo quando hai bisogno di compatibilità con sistemi più vecchi o policy che lo richiedono.
ssh-keygen -t ed25519 -a 100
Questo comando genera una coppia di chiavi Ed25519 e aumenta i round di derivazione della chiave usati per proteggere la passphrase della chiave privata. La chiave privata (id_ed25519) e la chiave pubblica (id_ed25519.pub) sono tipicamente memorizzate in ~/.ssh/.
Copiare la Tua Chiave Pubblica su un Server Remoto
Per abilitare l'autenticazione basata su chiave, la tua chiave pubblica deve essere inserita nel file ~/.ssh/authorized_keys sul server remoto. L'utility ssh-copy-id automatizza questo processo:
ssh-copy-id nome_utente@nome_host_o_indirizzo_IP
Questo comando ti chiederà la password dell'utente remoto una volta, poi copierà la tua chiave pubblica e imposterà i permessi corretti. Dopo questo, dovresti essere in grado di connetterti senza password (anche se ti verrà chiesta la passphrase della tua chiave privata se ne hai impostata una).
Attenzione: Non condividere mai la tua chiave privata con nessuno. Dovrebbe avere permessi di file restrittivi, come chmod 600 ~/.ssh/id_ed25519.
Gestire Connessioni e Configurazioni SSH
Eseguire un Singolo Comando in Remoto
SSH non è solo per shell interattive. Puoi eseguire un singolo comando su un server remoto direttamente e restituire il suo output al tuo terminale locale.
ssh nome_utente@nome_host_o_indirizzo_IP 'comando_da_eseguire'
Esempio:
ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'
Usare il File di Configurazione SSH (~/.ssh/config)
Per connessioni frequenti, definire gli host in ~/.ssh/config può far risparmiare tempo e semplificare i comandi. Questo file ti permette di impostare alias, specificare utenti, porte, chiavi private e altre opzioni di connessione.
Esempio di voce ~/.ssh/config:
Host webserver
Hostname 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_web
IdentitiesOnly yes
Host devbox
Hostname dev.miodominio.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
Una volta configurato, puoi connetterti semplicemente usando l'alias:
ssh webserver
ssh devbox
Buona Pratica: Usa il file ~/.ssh/config per connessioni ripetute. Migliora la leggibilità, riduce gli errori di digitazione e mantiene le opzioni di connessione in un unico posto. Evita di abilitare l'inoltro dell'agente globalmente; attivalo solo per gli host che ne hanno realmente bisogno.
Trasferimento Sicuro di File con SSH
SSH fornisce due strumenti principali per il trasferimento sicuro di file: scp e sftp.
scp (Secure Copy Protocol)
scp viene utilizzato per copiare file e directory tra host locali e remoti. Utilizza gli stessi meccanismi di autenticazione e sicurezza di SSH.
Copiare un File da Locale a Remoto
scp /percorso/del/file/locale nome_utente@nome_host_o_indirizzo_IP:/percorso/della/directory/remota/
Esempio:
scp my_app.tar.gz admin@webserver:/var/www/html/
Copiare un File da Remoto a Locale
scp nome_utente@nome_host_o_indirizzo_IP:/percorso/del/file/remoto /percorso/della/directory/locale/
Esempio:
scp admin@webserver:/var/log/nginx/access.log ~/logs/
Copiare una Directory Ricorsivamente
Usa il flag -r per le directory:
scp -r /percorso/della/directory/locale nome_utente@nome_host_o_indirizzo_IP:/percorso/della/directory/genitore/remota/
Preservare gli Attributi dei File
Per preservare i tempi di modifica, i tempi di accesso e le modalità, usa il flag -p:
scp -p filelocale utente@hostremoto:/percorsoremoto/
sftp (SSH File Transfer Protocol)
sftp fornisce un programma interattivo di trasferimento file, simile a FTP ma protetto da SSH. È ideale per gestire più file o eseguire operazioni complesse sulle directory.
Connettersi a un Server SFTP
sftp nome_utente@nome_host_o_indirizzo_IP
Una volta connesso, otterrai un prompt sftp>. I comandi comuni includono:
ls: Elenca il contenuto della directory remotalls: Elenca il contenuto della directory localecd directory_remota: Cambia directory remotalcd directory_locale: Cambia directory localeget file_remoto: Scarica un fileput file_locale: Carica un filemget file_remoti: Scarica più file (supporta wildcard)mput file_locali: Carica più file (supporta wildcard)exitobye: Esce dalla sessione SFTP
Esempio di Sessione SFTP:
sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini data/ logs/ public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye
Tunneling SSH e Port Forwarding
Il tunneling SSH, o port forwarding, ti permette di creare connessioni sicure tra porte locali e remote, consentendo l'accesso a servizi che altrimenti potrebbero essere bloccati da firewall o non accessibili direttamente.
Port Forwarding Locale (-L)
Il forwarding locale ti permette di accedere a un servizio su una rete remota (o sul server remoto stesso) dalla tua macchina locale come se fosse in esecuzione localmente.
ssh -L [porta_locale]:[host_remoto]:[porta_remota] nome_utente@server_ssh
Esempio: Accedi a un server di database (porta 3306) su una rete privata, attraverso un host di salto server_ssh, dalla porta 9000 della tua macchina locale.
ssh -L 9000:db.private.net:3306 [email protected]
Ora, puoi connetterti a localhost:9000 sulla tua macchina locale, e la connessione verrà inoltrata in modo sicuro a db.private.net:3306 tramite jumphost.com.
Port Forwarding Remoto (-R)
Il forwarding remoto rende un servizio sulla tua macchina locale (o rete locale) accessibile dal server remoto, e potenzialmente ai client sulla rete del server remoto.
ssh -R [porta_remota]:[host_locale]:[porta_locale] nome_utente@server_ssh
Esempio: Rendi un server web locale (porta 8000) accessibile da server_ssh sulla porta 8080.
ssh -R 8080:localhost:8000 admin@server_remoto.com
Ora, chiunque su server_remoto.com può accedere al tuo server web locale connettendosi a localhost:8080 su server_remoto.com.
Port Forwarding Dinamico (-D)
Il port forwarding dinamico crea un proxy SOCKS, permettendoti di instradare tutto il tuo traffico (o il traffico specifico dell'applicazione) attraverso il tunnel SSH. Questo è utile per bypassare firewall o proteggere la navigazione.
ssh -D [porta_locale] nome_utente@server_ssh
Esempio: Crea un proxy SOCKS sulla porta 1080 della tua macchina locale attraverso server_ssh.
ssh -D 1080 [email protected]
Configura il tuo browser o applicazione per usare localhost:1080 come proxy SOCKS5, e tutto il suo traffico di rete verrà incanalato attraverso jumphost.com.
Utilizzo Avanzato di SSH e Consigli
Eseguire Comandi in Background
Per comandi non interattivi che devono essere eseguiti e staccarsi, puoi usare il flag -f (va in background prima dell'esecuzione del comando) e -N (non esegue un comando remoto).
ssh -f -N -L 9000:db.private.net:3306 [email protected]
Questo imposta un port forwarding locale in background.
Agente SSH e ssh-add
ssh-agent è un programma che mantiene le tue chiavi private in memoria, così devi inserire la tua passphrase solo una volta per sessione. ssh-add aggiunge le chiavi all'agente.
# Avvia l'agente (se non è già in esecuzione)
eval "$(ssh-agent -s)"
# Aggiungi la/e tua/e chiave/i all'agente
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # Per una chiave specifica
L'inoltro dell'agente può permetterti di autenticarti da un host di salto a un altro server senza copiare la tua chiave privata sull'host di salto. Usalo con parsimonia: un host di salto compromesso potrebbe essere in grado di usare il tuo agente inoltrato mentre la tua sessione è attiva. Preferisci ProxyJump quando devi solo passare attraverso un bastione.
ssh -J [email protected] [email protected]
Connessioni SSH Persistenti (ControlMaster)
Per connessioni più veloci e overhead ridotto, ControlMaster nel tuo ~/.ssh/config permette a più sessioni SSH di condividere una singola connessione di rete.
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%C
ControlPersist 4h
Questa configurazione crea un socket di controllo per la prima connessione (ControlMaster auto) e le connessioni successive allo stesso host riutilizzeranno questo socket per un massimo di 4 ore (ControlPersist 4h).
Risoluzione dei Problemi SSH
- Permesso Negato: Controlla i permessi dei file per le chiavi private (
chmod 600 ~/.ssh/id_ed25519), le chiavi pubbliche (chmod 644 ~/.ssh/id_ed25519.pub) e la directory.ssh(chmod 700 ~/.ssh). Sul server, assicurati che~/.ssh/authorized_keysabbiachmod 600e~/.sshabbiachmod 700. - Connessione Scaduta: Il server potrebbe essere spento, il firewall bloccare la porta 22 (o la porta personalizzata), o l'indirizzo IP potrebbe essere errato.
- Output Dettagliato: Usa i flag
-v,-vv, o-vvvconsshper informazioni di debug dettagliate.ssh -vvv [email protected]
Conclusione
Mantieni il tuo flusso di lavoro SSH quotidiano semplice: usa l'autenticazione basata su chiave, memorizza le opzioni ripetute in ~/.ssh/config, copia i file con scp o sftp, e raggiungi i servizi privati con -L, -R, -D, o -J quando necessario. Quando una connessione fallisce, ssh -vvv è di solito il modo più veloce per vedere se il problema è DNS, routing, autenticazione o policy del server.