Accedere in ssh a un host tramite chiave pubblica/privata
Updated at: 07/06/2023


In ambiente Unix è comodo poter eseguire dei comandi in ssh su un host remoto o anche copiare i file con scp. Però entrambe le cose richiedono di inserire la password il che rende difficile scriptizzare il tutto per essere eseguito in automatico. Per ovviare il problema del login, si può utilizzare come autenticazione una coppia di chiavi pubblica/privata Identifichiamo con host_1 la macchina su cui girerà lo script e con remote_1 la macchina a cui vogliamo connetterci. Immaginiamo di essere connessi al nostro host_1 con l'utente user_1 Su remote_1, invece, sarà presente un utente user_2 con già "attivo l'ssh" (nel caso lo si può creare ed eseguire il primo comando di questa guida) Per prima cosa loggiamoci su host_1 con il nostro utente e generiamo la coppia di chiavi (verrà chiesto di immettere una password per proteggere  la chiave privata: ovviamente facendolo si aumenta la sicurezza, ma poi potremmo incappare in problemi nel momento in cui volessimo automatizzare il tutto, dato che ci verrebbe chiesta questa password quantomeno la prima volta che lanciamo l'ssh-agent, quindi volendo si può lasciare vuota)
ssh-keygen -t rsa -m pem -b 4096 [-C username@pcname]

Aggiungiamole ore alla nostro profilo, così che l'utente "sappia" cosa usare
[[ -z $SSH_AGENT_PID && -z $DISPLAY ]] && exec -l ssh-agent $SHELL -c "bash --login"
  Ora dobbiamo copiare la nostra chiave pubblica sul server remoto, in modo da potergli dire che il proprietario della corrispondente chiave privata è autorizzato al login
scp ~/.ssh/id_dsa.pub user_2@remote_1:.ssh/id_dsa.pub.user_1
dove "user_2" è l'utente con cui vorremo fare il login sulla macchina remota Ora facciamo login sul server remoto remote_1 con lo stesso utente (user_2) usato per copiare il file sulla macchina e aggiungiamo la chiave pubblica a quelle autorizzate
cat ~/.ssh/id_dsa.pub.user_1 >> ~/.ssh/authorized_keys
rm ~/.ssh/id_dsa.pub.user_1
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
  A questo punto possiamo connetterci, eseguire comandi e anche copiare file in scp da host_1 collegandoci direttamente a remote_1 Loggati in host_1 ad esempio possiamo eseguire:
ssh user_2@remote_1
ssh user_2@remote_1 'cp -r /tmp/some_dir /tmp/other_dir' # per eseguire un comando direttamente sulla macchina remota
scp user_2@remote_1:/tmp/some_dir/* /local/dir # per copiare i file da remote_1 a host_1
Il tutto senza dover mai scrivere la password (se abbiamo configurato tutto bene ed è andato tutto a buon fine).   Se abbiamo deciso di impostare una password a protezione della nostra chiave privata e non c'è già un ssh-agent configurato, dobbiamo lanciare i seguenti comandi
ssh-agent
ssh-add
  Guida di riferimento (e per altre opzioni): http://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-passwordless-login.html