Comment copiez-vous la clé publique sur un serveur ssh?

33

Voici ce que j'ai essayé et j'ai eu une erreur:

$ cat /home/tim/.ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory
Tim
la source
Pourquoi ne pas le faire en deux étapes? Copiez-le et ajoutez-le ensuite?
Faheem Mitha
@FaheemMitha: Cela fonctionne, merci! Je pourrais en fait réaliser la cause du problème. S'il vous plaît voir mon nouveau message ?
Tim
Avec le paramètre -f, vous n'avez pas besoin de la clé privée, vous pouvez donc simplement lui passer la clé avec uniquement la clé publique de quelqu'un!
Kzqai

Réponses:

67

OpenSSH est livré avec une commande pour ce faire, ssh-copy-id. Vous lui donnez simplement l'adresse distante et il ajoute votre clé publique au authorized_keysfichier sur la machine distante:

$ ssh-copy-id [email protected]

Vous devrez peut-être utiliser l' -iindicateur pour localiser votre clé publique sur votre ordinateur local:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
Michael Mrozek
la source
1
Merci! Pourquoi ma commande ne fonctionne pas?
Tim
@Tim Cette réponse l'a expliqué; >>est géré par votre shell, et vous exécutez la commande via SSH au lieu de passer par un shell. Son correctif d'avoir SSH exécutant un shell, qui exécute ensuite votre commande, devrait fonctionner
Michael Mrozek
Merci! (1) ssh-copy-id ne fonctionne pas non plus. Je copie manuellement le fichier sur la télécommande et ajoute son contenu, puis cela fonctionne. Je me demande pourquoi J'ai trouvé que mon shell par défaut sur le serveur est un script, que je mets à jour dans ma publication d'origine, et qui pourrait être la raison. Jetez un coup d'oeil s'il vous plait. (2) Je me demande si ssh-copy-id ne fait que copier la clé publique sur la télécommande, il ne crée pas la clé privée et publique, n'est-ce pas?
Tim
1
Supposons que le serveur SSH est configuré de telle manière qu'il n'accepte que l'authentification par clé publique comme mécanisme d'authentification. Dans ce cas, l'utilisation ssh-copy-idne fonctionnera pas, non?
Abdull
1
@Abdull Pas sauf si vous avez déjà une autre clé sur cette machine pour vous connecter. Il suffit de se connecter via SSH
Michael Mrozek
31

Vous pouvez toujours faire quelque chose comme ça:

scp ~/.ssh/id_rsa.pub [email protected]:/tmp/id_rsa.pub
ssh [email protected] 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

Je ne sais pas si vous pouvez catpartir d'une machine locale dans une session ssh. Déplacez-le simplement dans / tmp comme suggéré.

Edit: c'est exactement ce qui ssh-copy-idfait. Comme Michael l'a dit.

Mr. Monkey
la source
Merci! Je me demande si ssh-copy-id ne fait que copier la clé publique sur la télécommande. Il ne crée pas la clé privée et publique, n'est-ce pas?
Tim
Non, il ne le crée pas. Il suffit de l'ajouter.
M. Monkey
@ Mr.Monkey Oui, vous pouvez diriger des données vers une session ssh (à partir de catou autrement). Ce que vous décrivez est à l'ancienne; ssh-copy-idest recommandé car il y a moins de risques de fautes de frappe ou de donner aux fichiers de mauvaises autorisations.
Gilles 'SO- arrête d'être méchant'
@Gilles, Vous n'avez pas toujours accès au serveur pour le client, surtout lorsque vous préparez un ordinateur pour son fonctionnement, donc cette méthode est bien meilleure que d'utiliser ssh-cpy-id car vous n'avez pas besoin de prendre l'équipement ou connectez-vous au réseau avant de configurer.
e-info128
1
Ou vous pouvez simplement conduit directement à la destination : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A
7

Cette réponse décrit comment faire fonctionner la manière voulue indiquée dans la question.

Vous pouvez exécuter un shell sur l'ordinateur distant pour interpréter la signification particulière de l' >>opérateur de redirection:

ssh [email protected] sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

L'opérateur de redirection >>est normalement interprété par un shell.

Lorsque vous exécutez, ssh host 'command >> file'il n'est pas garanti que ce command >> filesera interprété par un shell. Dans votre cas, il command >> fileest exécuté à la place du shell sans interprétation spéciale et a >>été donné à la commande comme argument - de la même manière que l'exécution command '>>' filedans un shell.

Certaines versions de SSH (OpenSSH_5.9) invoqueront automatiquement le shell sur le serveur distant et lui passeront la ou les commandes lorsqu'ils détecteront des jetons à interpréter par un shell comme ; > >>etc.

Pabouk
la source
3

opensshne fournit ssh-copy-id. La séquence serait:

  • Générez une clé 4k décente

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Démarrez votre agent ssh et aspirez des informations comme SSH_AGENT_PID, etc.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Maintenant, commencez à charger des clés dans votre agent SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Vérifiez qu'il est chargé

    ssh-add -l
    ssh-add -L
    

    Cela vous montrera ce que vous avez dans l'agent ssh

  • Désormais SSH vers un système distant

    ssh [email protected]
    
  • Vous pouvez maintenant exécuter ssh-copy-id sans arguments:

    ssh-copy-id
    

    Cela crée ~/.ssh/authorized_keyset remplit les informations de base requises de ssh-agent.

Christipher J THOMPSON
la source
BTW, j'ai créé un petit script sur github.com/centic9/generate-and-send-ssh-key qui exécute la plupart de ces étapes en une seule fois et assure en outre des autorisations de fichier / répertoire qui me causent généralement toujours des maux de tête ...
centic
Il s'agit d'une excellente méthode à utiliser lorsque la connexion par mot de passe est désactivée. Il permet d'ajouter une nouvelle clé tout en s'authentifiant avec une clé précédente.
MountainX
1

J'ai eu des problèmes avec ssh-copy-id lors du choix d'un autre port que 22 ... alors voici mon oneliner avec un port ssh différent (par exemple 7572):

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

En effet, la the ssh-copy-idcommande fait exactement cela (à partir du openssh-clientpackage):

ssh-copy-id user@host

Remarque:
hostsignifie adresse IP ou domaine .


Je voudrais également ajouter quelques informations supplémentaires à ce

1) Nous pouvons spécifier un port différent pour SSH sur le serveur de destination:

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

Remarque:
le port doit être en face du user@hostou il ne se résoudra pas.

La source

2) On peut spécifier un fichier avec une clé publique :

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

Remarque:
L' -ioption nous permet d'indiquer l'emplacement approprié du nom avec le fichier qui contient la clé publique.

Parfois, cela peut être utile, surtout si nous le stockons dans un emplacement non standard ou si nous avons plusieurs clés publiques sur notre ordinateur et que nous voulons en indiquer une spécifique.

simhumileco
la source