Existe um equivalente ao ssh-copy-id para Windows?

56

Existe alguma porta ou equivalente de ssh-copy-id disponível para Windows? Ou seja, existe uma maneira fácil de transferir chaves SSH de uma máquina local para um servidor remoto no Windows?

Caso isso ajude, já estou usando Pageant e Kitty (uma alternativa ao Putty).

Matt V.
fonte

Respostas:

27

O ssh-copy-id é um script bastante simples que deve ser bastante fácil de replicar no Windows.

Se você ignorar toda a manipulação de parâmetros, manipulação de erros e assim por diante, esses são os dois comandos do ssh-copy-id que realmente estão realizando o trabalho a maior parte do tempo.

GET_ID="cat ${ID_FILE}"
{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

Usando as ferramentas putty, um comando como este deve ser equivalente (não testado).

type  public_id | plink.exe username@hostname "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"

Se você deseja fazer o mesmo tratamento de erros e o local automático da chave, tenho certeza de que escrever um script no Windows será muito mais complicado, mas certamente possível.

Zoredache
fonte
1
Obrigado! Eu não consegui fazê-lo funcionar no começo; Eu estava recebendo erros de "acesso negado" de volta, mas o plink não parava para me deixar digitar a senha. Eu tentei passar plink a senha usando a opção -pw e funcionou. Você sabe se existe uma maneira de interromper o plink para inserir a senha no meio do caminho?
Matt V.
Não tenho muita certeza sobre autenticação de senha e plink. Sempre que eu realmente o uso, já tenho minha chave no sistema e tenho o pagent em execução.
precisa saber é o seguinte
4
plink.exe -pw passwordtrabalho. Além disso, se você sabe .ssh / authorized_keys existe o comando é simplesmentetype id_rsa.pub | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys"
KCD
@KCD É suficiente se o .ssh/diretório existir. O >>redirecionamento criará o arquivo se ele não existir.
pabouk
20

Essas respostas não me ajudaram. Eu realmente não precisava de scripts malucos. Eu criei uma chave pública na minha máquina cliente no git bash e estava tentando copiá-la para um VPS.

Após criar sua chave pública, a chave deve ser armazenada como "(qualquer pasta em que você iniciou) /. Ssh / id_rsa.pub"

Portanto, use este comando:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys" onde userestá o seu nome de usuário (às vezes "root" ou o que você tiver configurado) e substitua 123.45.67.89pelo endereço IP da sua máquina / host / VPS.

Se o diretório .sshainda não foi criado na máquina host, use esta pequena variação:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Augie Gardner
fonte
2
Gostaria de ter mais votos! 👍 para o one-liner!
Patricktokeeffe 5/10
16

O ssh-copy-id faz algumas coisas (leia a página de manual para obter detalhes), mas a coisa mais importante a fazer é anexar o conteúdo do seu arquivo de chave pública local a um arquivo remoto chamado allowed_keys.

  • Você pode fazer isso sozinho abrindo o arquivo de chaves com um editor de texto e colando o conteúdo no terminal Kitty.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • Como alternativa, você pode fazer o upload do arquivo usando o WinSCP (que usa sftp ou scp como fallback) e fazer algo semelhante à minha sugestão anterior, sem a cópia / colagem feia.
    cat id_rsa.pub >> .ssh/authorized_keys
    onde id_rsa.pub é o nome do arquivo da chave pública que você enviou.

Kenny Rasschaert
fonte
5

Inspirado pela resposta do zoredache, criei vários scripts que são a versão do Windows. No entanto, todos eles dependem do plink. Por favor, dê uma olhada aqui

https://github.com/VijayS1/Scripts/blob/master/ssh-copy-id/

Eu também tenho um script winscp que pode ser usado como por outra resposta. :) Trecho do leia-me:

Métodos tentados até agora:

  • DOS (.cmd) - Sucesso
  • VBS (.vbs) - Sucesso
  • PowerShell (.ps1) - Sucesso
  • mremoteNG (ext app) - Sucesso
    • Selecione Host, clique com o botão direito do mouse, ferramentas externas, selecione Scriptname
  • Script WinSCP (.bat) - Sucesso
    • # "WinSCP.com" /script=".\Scriptname" /parameter "user[:password]@example.com" "id_rsa.pub" [/log=".\copyssh.log]"
Vijay
fonte
1
Estes são muito doces #
11/07/2012
5

No Windows 7, há um ssh.exe

Aqui está o que funcionou para mim:

1. criar identidade (no windows)

c:\>ssh-keygen

Isso criou um arquivo de identidade no diretório inicial. Mudei o nome da chave pública para "id_rsa"

2. copie o arquivo para o sistema linux de destino usando os créditos ssh em https://serverfault.com/users/984/zoredache para obter sua resposta

c:\>ssh user@lnxhost "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1" < \\path_to_where_the_file_was_generated_from_ssh_key_gen\id_rsa.pub

Nota: Por algum motivo, a tubulação não funcionou para mim:

# this should work but it didn't work for me 
type file | ssh user@lnxhost "cat >> /tmp/t.txt"

3. Corrija o arquivo no linux O arquivo id_rsa.pub no Windows é multilinha, em que o linux espera em uma única linha, por isso precisamos corrigi-lo um pouco. Entre no linux e abra o arquivo:

vi ~/.ssh/authorized_keys

Por exemplo:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, user@winhost"
AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla33
5flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMC
Y58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVy
ax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdT
LFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHE
Qkw+1wuV6dFoT1/hngSw==
---- END SSH2 PUBLIC KEY ----

Deve se tornar

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla335flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMCY58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVyax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdTLFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHEQkw+1wuV6dFoT1/hngSw== user@winhost

4. teste

c:\>ssh user@lnxhost "ls -al /tmp/"

Isso deve listar o conteúdo de / tmp sem solicitar a senha.

Deian
fonte
1
👍 para a Etapa 3. Reformatar authorized_keyspara linhas únicas é tudo que eu precisava!
Patricktokeeffe 15/02/19
feliz que ajudou você - até votar a resposta :) #
314 Deian Deian
5

Se você não possui o ssh-copy-idWindows, pode executá-lo no próprio servidor.

  • No PuTTYgen, carregue sua chave privada (.ppk);
  • Copie o conteúdo da caixa Chave pública para colar no arquivo OpenSSH allowed_keys em uma área de transferência.
  • Cole-o no seu editor favorito (o Windows Notepad fará).
  • Salve o conteúdo em um arquivo com .pubextensão.
  • Carregue o .pubarquivo no servidor.
  • Faça logon no servidor com um cliente SSH, como PuTTY.
  • No servidor, digite:

    ssh-copy-id -i mykey.pub username@localhost
    

No Windows, o ssh-copy-idscript é fornecido com o Git for Windows . Portanto, você pode usá-lo localmente, se tiver o Git for Windows.


Se você não quiser fazer isso manualmente, poderá usar o WinSCP 5.15. Pode configurar a autenticação de chave pública para você.
Use o botão Ferramentas> Instalar chave pública no servidor no SSH> Página de autenticação da caixa de diálogo Configurações avançadas do site do WinSCP .

insira a descrição da imagem aqui

(Eu sou o autor do WinSCP)

Martin Prikryl
fonte
Esta deve ser a resposta aceita: git-bash para Windows 7; Subsistema Linux disponível no Windows 10
Alex
0

Se você estiver usando o cmder (ou msysgit / mingw que possui scp & ssh), acabei de escrever um script python simples para isso. Pode ser encontrado aqui: https://gist.github.com/ceilfors/fb6908dc8ac96e8fc983

Exemplo de uso: python ssh-copy-id.py user @ remote-machine.

A senha será solicitada ao executar o script.

ceilfors
fonte
por que isso requer cmder?
David Zorychta
@ user57411 Não requer cmder, requer comandos scp e ssh.
ceilfors
0

o que eu fiz, tendo o CygWin no meu Win10, conectando-me ao Linux (com base na resposta acima):

- note: usando cat, ele resolveria o caminho cygwin automaticamente, assim como qualquer comando cygwin usando a estrutura de pastas cygwin-linux-folder

1. added c:\cygwin\bin to the environment's Path variable
2. starting cmd.exe (windows commandline)
3. > ssh-keygen -t rsa   (just pressing enter till done)
4. > cat ~/.ssh/id_rsa.pub | ssh user@server "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys"
5. ..enter server password
6. > ssh user@server (testing, not beeing asked for password)
BananaAcid
fonte
0

Os seguintes passos serviriam:

PASSO-1: Gerar par de chaves RSA

C:\Users\user>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/user//.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/user//.ssh/id_rsa.
Your public key has been saved in /c/Users/user//.ssh/id_rsa.pub.
The key fingerprint is:
20:16:9b:0d:00:92:c4:34:99:51:20:b7:ef:50:c4:0f user@localhost

STE2-2: equivalente ssh-copy-id no Windows

C:\Users\user>ssh user@remote "umask 077; test -d .ssh || mkdir .ssh ; cat >> .s
sh/authorized_keys || exit 1" < "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys
 || exit 1" < C:\Users\user\.ssh\id_rsa.pub
The authenticity of host 'remote (xx.xx.xxx.xx)' can't be established.
RSA key fingerprint is 99:99:73:74:fe:14:bc:91:c8:3b:ac:f4:95:99:4d:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'remote,xx.xx.xxx.xx' (RSA) to the list of known hosts.
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
user@remote's password:[Enter Password for first time]

PASSO-3: A autenticação sem senha funciona!

C:\Users\user>ssh user@remote
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
Last login: Wed Oct 14 14:37:13 2015 from localhost
GANESH
fonte
0

Versão do PowerShell para SSH incluída no Git For Windows

De fato, ele pode funcionar enquanto você estiver sshno seu caminho. Adicione o seguinte no seu perfil do PowerShell:

function ssh-copy-id([string]$userAtMachine){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}

Em um console do PowerShell:

ssh-copy-id user@machine
Fab
fonte
O ssh-copy-id não deve gerar uma chave se ela não existir.
RalfFriedl
@RalfFriedl eu removi o keygen
Fab