Se almeno una volta avete avuto a che fare con la gestione di server, sistemi IoT ma anche semplicemente shared hosting e macchine virtuali, sarà capitato di avere molteplici indirizzi, username e password, spesso completamente diversi fra loro, spesso composte da sequenze di caratteri difficili se non impossibili da ricordare e magari nessun dominio ma un mero IP statico.

Shell alias

Ipotizziamo di avere un server remoto dev.example.com, che non sia stato configurato con delle chiavi pubbliche/private per l’accesso senza password.
L’username d’accesso ipotizziamo sia “alan”. E la porta non è la standard 22 ma la 2200, per evitare tentativi di login automatici indesiderati.
Questo significa che un comando tipico sarà:

$ ssh alan@dev.example.com -p 22000
password: *************

Possiamo rendere le cose più semplici e sicure usando una coppia di chiavi pubblica e privata. Si raccomanda l’uso di ssh-copy-id per spostare in giro la propria chiave pubblica. Ci risparmia la seccatura di dover gestire eventuali problemi di permessi legati alle cartelle e al file spostato.
Dunque assumendo di aver configurato la coppia di chiavi, il comando sufficiente sarà:

$ ssh [email protected] -p 22000

Non è così male. Per abbreviare ulteriormente e velocizzare l’operazione è possibile creare un’alias sulla shell:

$ alias dev='ssh [email protected] -p 22000'
$ dev # Per connettersi

Questo funziona egregiamente: Ogni nuovo server a cui ci si vuol connettere necessita di un nuovo alias che può essere inserito in modo permanente all’interno del file .bashrc

Tuttavia c’è un’altra soluzione ancora più elegante a questo problema.

~/.ssh/config

SSH già predispone un file di configurazione. Che può essere globale (/etc/ssh/ssh_config) o user-specific (~/.ssh/config).
L’esempio sopra si tradurrebbe in:

# contenuto di $HOME/.ssh/config
Host dev
    HostName dev.example.com
    Port 22000
    User alan

Questo significa che è sufficiente lanciare il comando ssh dev per connettersi in SSH al server. Il comando va infatti a leggersi il file di configurazione in cerca di un Host chiamato “dev”.
Vediamo invece un altro esempio che fa si che venga usata una determinata chiave privata per tutte le operazioni relative all’account Github.

Host github.com
    IdentityFile ~/.ssh/github.key

L’uso di IdentityFile permette di specificare esattamente quale chiave privata usare per l’autenticazione con l’host.
Ovviamente è possibile specificarla anche durante le connessioni lanciate con il comando manualmente:

$ ssh -i ~/.ssh/blah.key username@host.com

Ancora un altro esempio di configurazione per connetterci al Raspberry-Pi:

Host rpi
	hostname roccomuso.ddns.net
	IdentityFile /home/user/.ssh/rpi.pub
	User root
	Port 22

Così che da linea di comando sarà sufficiente lanciare ssh rpi per ritrovarci dentro al Raspberry come se niente fosse.

Tunnel SSH

Spesso su certi server si tende a inserire un firewall per non esporre tutte quelle porte che rimandano a servizi con dati sensibili, vedi porte per DataBase etc.
Si potrebbe pensare che questo previene la possibilità di accedere a quel servizio da remoto e dunque ad esempio non ci potremmo connettere dal nostro Client per la visualizzazione dei dati. Ma non è del tutto così.
Possiamo infatti fare un semplice reindirizzamento della porta locale, in gergo, un Tunnel SSH:

$ ssh -f -N -L 9906:127.0.0.1:3306 pippo@database.example.com
# -f mette ssh in background
# -N non permette l'esecuzione di comandi remoti

Questo comando non fa altro che inoltrare tutto il traffico sulla porta 9906 alla porta 3306 sul server remoto dev.example.com. Facendo si che puntando il client all’indirizzo localhost:9906 ci si connetta di fatti alla porta 3306 sul server remoto. Nota bene che nel comando sopra, l’indirizzo 127.0.0.1 fa riferimento all’host REMOTO, dunque volendo far un tunnel verso la porta 80 di un altro host presente nella rete bersaglio, si può semplicemente sostituire 127.0.0.1 con 192.168.1.1 ad esempio.
Anche in questo caso, piuttosto che memorizzare indirizzi e parametri necessari per ottenere questo tipo di soluzioni. Possiamo codificare il tutto nel nostro pratico file di configurazione:

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    LocalForward 9906 127.0.0.1:3306
    User pippo

Così da poter stabilire una connessione con il comando: ssh -f -N tunnel

Conclusione

Ci sono diverse opzioni di configurazione per SSH. Si consiglia dunque di rifarsi alla documentazione ufficiale per eventuali approfondimenti.

Spero che questi consigli possano tornare utile a qualcuno. Se avete altri suggerimenti o miglioramenti che è possibile apportare, lasciate pure un commento!