Come si copia la chiave pubblica su un server ssh?


33

Ecco cosa ho provato e ho ricevuto un errore:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

Perché non farlo in due passaggi? Copiarlo e poi aggiungerlo?
Faheem Mitha,

@FaheemMitha: Funziona, grazie! In realtà potrei rendermi conto della causa del problema. Vedi il mio nuovo post ?
Tim

Con il parametro -f non hai bisogno della chiave privata, quindi puoi semplicemente passargli la chiave solo con la chiave pubblica di qualcuno!
Kzqai,

Risposte:


67

OpenSSH è dotato di un comando per fare questo, ssh-copy-id. Basta dargli l'indirizzo remoto e aggiunge la chiave pubblica al authorized_keysfile sul computer remoto:

$ ssh-copy-id tim@just.some.other.server

Potrebbe essere necessario utilizzare la -ibandiera per individuare la chiave pubblica sul tuo computer locale:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
Grazie! Perché il mio comando non funziona?
Tim

@Tim Questa risposta l'ha spiegato; >>viene gestito dalla shell e si esegue il comando tramite SSH anziché tramite una shell. La sua correzione per far eseguire a SSH una shell, che esegue il tuo comando, dovrebbe funzionare
Michael Mrozek

Grazie! (1) ssh-copy-id non funziona neanche. Copio manualmente il file sul telecomando e aggiungo il suo contenuto, quindi funziona. Mi chiedo perché sia ​​questo? Ho scoperto che la mia shell predefinita sul server è uno script, che aggiorno al mio post originale, e potrebbe essere il motivo. Per favore guarda. (2) Mi chiedo se ssh-copy-id è solo copiare la chiave pubblica sul telecomando, non crea la chiave privata e pubblica, vero?
Tim

1
Supponiamo che il server SSH sia configurato in modo tale da accettare solo l'autenticazione con chiave pubblica come meccanismo di autenticazione. In tal caso, l'utilizzo ssh-copy-idnon funzionerà, giusto?
Abdull

1
@Abdull No a meno che tu non abbia già qualche altra chiave su quella macchina con cui connetterti. Si sta solo collegando tramite SSH
Michael Mrozek

31

Puoi sempre fare qualcosa del genere:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

Non sono sicuro di poter passare catda una macchina locale a una sessione ssh. Basta spostarlo su / tmp come suggerito.

Modifica: questo è esattamente ciò che ssh-copy-idfa. Proprio come ha detto Michael.


Grazie! Mi chiedo se ssh-copy-id è semplicemente copiare la chiave pubblica sul telecomando. Non crea la chiave privata e pubblica, vero?
Tim

No, non lo crea. Lo aggiunge e basta.
Mr. Monkey

@ Mr.Monkey Sì, è possibile reindirizzare i dati in una sessione ssh (da cato in altro modo). Quello che stai descrivendo è alla vecchia maniera; ssh-copy-idè consigliato perché c'è meno rischio di errori di battitura o di dare autorizzazioni errate ai file.
Gilles 'SO- smetti di essere malvagio' il

@Gilles, Non hai sempre accesso al server al client, specialmente quando stai preparando un computer per il suo funzionamento, quindi questo metodo è molto meglio dell'uso di ssh-cpy-id perché non hai bisogno di prendere l'attrezzatura o connettersi alla rete prima di impostare.
e-info128,

1
Oppure si può semplicemente il tubo direttamente alla destinazione : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Questa risposta descrive come far funzionare il modo previsto mostrato nella domanda.

È possibile eseguire una shell sul computer remoto per interpretare il significato speciale >>dell'operatore di reindirizzamento:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

L'operatore di reindirizzamento >>viene normalmente interpretato da una shell.

Quando esegui, ssh host 'command >> file'non è garantito che command >> fileverrà interpretato da una shell. Nel tuo caso command >> fileviene eseguito invece della shell senza una speciale interpretazione ed è >>stato dato al comando come argomento, allo stesso modo dell'esecuzione command '>>' filein una shell.

Alcune versioni di SSH (OpenSSH_5.9) invocano automaticamente la shell sul server remoto e gli passano i comandi quando rilevano i token che devono essere interpretati da una shell come ; > >>ecc.


3

opensshfornisce ssh-copy-id. La sequenza sarebbe:

  • Genera una chiave 4K decente

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Avvia il tuo ssh-agent e succhia informazioni come SSH_AGENT_PID, ecc.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Ora inizia a caricare le chiavi nel tuo agente SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Verificare che sia caricato

    ssh-add -l
    ssh-add -L
    

    Questo ti mostrerà quello che hai nell'agente ssh

  • Ora in realtà SSH su un sistema remoto

    ssh username@remotehost.network
    
  • Ora puoi eseguire ssh-copy-id senza argomenti:

    ssh-copy-id
    

    Questo crea ~/.ssh/authorized_keyse riempie le informazioni di base richieste da ssh-agent.


A proposito, ho creato un piccolo script su github.com/centic9/generate-and-send-ssh-key che esegue la maggior parte di questi passaggi in una volta sola e garantisce inoltre autorizzazioni per file / directory che di solito mi hanno sempre causato mal di testa ...
centic

Questo è un ottimo metodo da usare quando l'accesso con password è disabilitato. Consente di aggiungere una nuova chiave durante l'autenticazione con una chiave precedente.
MountainX

1

Ho avuto problemi con ssh-copy-id quando ho scelto un'altra porta rispetto a 22 ... quindi ecco il mio oneliner con una diversa porta ssh (ad esempio 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

Infatti il the ssh-copy-idcomando fa esattamente questo (dal openssh-clientpacchetto):

ssh-copy-id user@host

Nota:
hostsignifica indirizzo IP o dominio .


Vorrei anche aggiungere alcune informazioni aggiuntive a questo

1) Possiamo specificare una porta diversa per SSH sul server di destinazione:

ssh-copy-id "-p 8127 user@host"

Nota:
la porta deve trovarsi davanti user@hosto non si risolverà.

fonte

2) Possiamo specificare un file con una chiave pubblica :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Nota:
l' -iopzione ci consente di indicare la posizione appropriata del nome con il file che contiene la chiave pubblica.

A volte può tornare utile, soprattutto se lo memorizziamo in una posizione non standard o abbiamo più di una chiave pubblica sul nostro computer e vogliamo indicarne una specifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.