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 [email protected] 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory
Tim
fonte
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 [email protected]

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 [email protected]
Michael Mrozek
fonte
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 [email protected]:/tmp/id_rsa.pub
ssh [email protected] 
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.

Mr. Monkey
fonte
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 [email protected] 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.

pabouk
fonte
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 [email protected]
    
  • 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.

Christipher J THOMPSON
fonte
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
user2664227
fonte
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.

simhumileco
fonte