Como você copia a chave pública para um servidor ssh?


33

Aqui está o que eu tentei e recebi um erro:

$ 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

Por que não fazer isso em duas etapas? Copie e anexe?
Faheem Mitha

@FaheemMitha: Isso funciona, obrigado! Na verdade, eu posso perceber a causa do problema. Por favor, veja meu novo post ?
Tim

Com o parâmetro -f, você não precisa da chave privada; portanto, você pode passar a chave para eles apenas com a chave pública de alguém!
Kzqai

Respostas:


67

O OpenSSH vem com um comando para fazer isso ssh-copy-id,. Você apenas fornece o endereço remoto e ele adiciona sua chave pública ao authorized_keysarquivo na máquina remota:

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

Pode ser necessário usar o -isinalizador para localizar sua chave pública na sua máquina local:

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

11
Obrigado! Por que meu comando não funciona?
Tim

@ Tim Esta resposta explicou; >>é tratado pelo seu shell e você está executando o comando através do SSH em vez de através de um shell. Sua correção de fazer com que o SSH execute um shell, que executa seu comando, deve funcionar
Michael Mrozek

Obrigado! (1) ssh-copy-id também não funciona. Copio manualmente o arquivo para o controle remoto e anexo seu conteúdo, para que ele funcione. Eu me pergunto por que isso é? Descobri que meu shell padrão no servidor é algum script, que atualizo para minha postagem original, e pode ser o motivo. Por favor, dê uma olhada. (2) Gostaria de saber se ssh-copy-id é apenas copiar a chave pública para o controle remoto, não cria a chave pública e privada, cria?
Tim

11
Vamos supor que o servidor SSH esteja configurado de tal maneira que aceite apenas autenticação de chave pública como um mecanismo de autenticação. Nesse caso, usar ssh-copy-idnão funcionará, certo?
Abdull

11
@ Abdull Não, a menos que você já tenha alguma outra chave nessa máquina para se conectar. Está apenas se conectando através de SSH
Michael Mrozek

31

Você sempre pode fazer algo assim:

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

Não tenho certeza se você pode catde uma máquina local para uma sessão ssh. Apenas mova-o para / tmp como sugerido.

Edit: Isto é exatamente o que ssh-copy-idfaz. Assim como Michael disse.


Obrigado! Gostaria de saber se ssh-copy-id é apenas copiar a chave pública para o controle remoto. Ele não cria a chave pública e privada, cria?
Tim

Não, não o cria. Apenas adiciona.
Mr. Monkey

@ Mr.Monkey Sim, você pode canalizar dados para uma sessão ssh (de catou de outra forma). O que você está descrevendo é a maneira antiquada; ssh-copy-idé recomendado porque há menos risco de erros de digitação ou concessão de permissões erradas aos arquivos.
Gilles 'SO- stop be evil'

@Gilles, você nem sempre tem acesso ao servidor para o cliente, especialmente quando está preparando um computador para sua operação, portanto esse método é muito melhor do que usar o ssh-cpy-id porque você não precisa levar o equipamento ou conecte-se à rede antes de configurar.
e-info128

11
Ou você pode simplesmente encaminhar diretamente para o destino : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Esta resposta descreve como fazer com que a maneira pretendida mostrada na pergunta funcione.

Você pode executar um shell no computador remoto para interpretar o significado especial do >>operador de redirecionamento:

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

O operador de redirecionamento >>é normalmente interpretado por um shell.

Quando você executa ssh host 'command >> file', não há garantia de que command >> fileserá interpretado por um shell. No seu caso, command >> fileé executado em vez do shell sem interpretação especial e >>foi dado ao comando como argumento - da mesma maneira que a execução command '>>' fileem um shell.

Algumas versões do SSH (OpenSSH_5.9) invocam automaticamente o shell no servidor remoto e passam o (s) comando (s) a ele quando detectam tokens a serem interpretados por um shell como ; > >>etc.


3

opensshfornece ssh-copy-id. A sequência seria:

  • Gere uma chave 4k decente

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Inicie seu ssh-agent e obtenha informações como SSH_AGENT_PIDetc.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Agora comece a carregar chaves no seu agente SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Verifique se está carregado

    ssh-add -l
    ssh-add -L
    

    Isso mostrará o que você tem no agente ssh

  • Agora, na verdade, SSH para um sistema remoto

    ssh username@remotehost.network
    
  • Agora você pode executar ssh-copy-id sem argumentos:

    ssh-copy-id
    

    Isso cria ~/.ssh/authorized_keyse preenche as informações básicas necessárias do ssh-agent.


BTW, criei um pequeno script em github.com/centic9/generate-and-send-ssh-key que executa a maioria dessas etapas de uma só vez e garante adicionalmente permissões de arquivo / diretório que geralmente sempre me causam dores de cabeça ...
centic

Este é um ótimo método para usar quando o login com senha estiver desativado. Permite adicionar uma nova chave enquanto se autentica com uma chave anterior.
MountainX

1

Eu tive problemas com ssh-copy-id ao escolher outra porta que não 22 ... então aqui está o meu oneliner com uma porta ssh diferente (por exemplo, 7572):

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

0

De fato, o the ssh-copy-idcomando faz exatamente isso (do openssh-clientpacote):

ssh-copy-id user@host

Nota:
host significa endereço IP ou domínio .


Gostaria também de adicionar algumas informações adicionais a este

1) Podemos especificar uma porta diferente para SSH no servidor de destino:

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

Nota:
A porta deve estar na frente da user@hostou não será resolvida.

Fonte

2) nós podemos especificar um arquivo com uma chave pública :

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

Nota:
A -iopção nos permite indicar o local apropriado do nome com o arquivo que contém a chave pública.

Às vezes, pode ser útil, especialmente se a armazenarmos em um local fora do padrão ou se tivermos mais de uma chave pública em nosso computador e desejarmos apontar para uma específica.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.