¿Hay un equivalente a ssh-copy-id para Windows?

56

¿Hay algún equivalente o puerto de ssh-copy-id disponible para Windows? Es decir, ¿hay una manera fácil de transferir claves SSH desde una máquina local a un servidor remoto en Windows?

En caso de que ayude, ya estoy usando Pageant y Kitty (una alternativa de Putty).

Matt V.
fuente

Respuestas:

27

ssh-copy-id es un script bastante simple que debería ser bastante fácil de replicar en Windows.

Si ignora todo el manejo de parámetros, manejo de errores, etc., estos son los dos comandos de ssh-copy-id que realmente están haciendo el trabajo la mayor parte del tiempo.

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

Usando las herramientas de masilla, un comando como este debería ser equivalente (no probado).

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

Si desea hacer el mismo manejo de errores y la ubicación automática de la clave, estoy seguro de que escribir un script en Windows será mucho más complicado, pero ciertamente posible.

Zoredache
fuente
1
¡Gracias! Al principio no pude hacerlo funcionar; Recibía errores de "acceso denegado", pero Plink no se detenía para permitirme ingresar la contraseña. Luego intenté pasar la contraseña usando la opción -pw y funcionó. ¿Sabes si hay una manera de hacer una pausa para que ingreses la contraseña a mitad de camino?
Matt V.
No estoy realmente seguro sobre la autenticación de contraseña y plink Cada vez que lo uso, ya tengo mi clave en el sistema, y ​​tengo corriendo el pagent.
Zoredache
44
plink.exe -pw passwordtrabajos. Además, si sabe que existe .ssh / Authorizedkeys, el comando es simplementetype id_rsa.pub | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys"
KCD
@KCD Es suficiente si el .ssh/directorio existe. La >>redirección creará el archivo si no existe.
pabouk
20

Estas respuestas no me ayudaron. Realmente no necesitaba ningún guión loco. Había creado una clave pública en mi máquina cliente en git bash e intentaba copiarla en un VPS.

Después de crear su clave pública, la clave debe almacenarse como "(cualquier carpeta en la que haya comenzado) /. Ssh / id_rsa.pub"

Entonces use este comando: ¿
cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys" dónde userestá su nombre de usuario (a veces "root", o lo que sea que haya configurado) y reemplácelo 123.45.67.89con la dirección IP de su máquina / host / VPS.

Si el directorio .sshaún no se ha creado en la máquina host, use esta pequeña variación:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Augie Gardner
fuente
2
¡Ojalá tuviera más votos! 👍 para el one-liner!
patricktokeeffe
16

ssh-copy-id hace un par de cosas (lea la página del manual para más detalles), pero lo más importante que hace es agregar el contenido de su archivo de clave pública local a un archivo remoto llamado Authorizedkeys.

  • Puede hacerlo usted mismo abriendo el archivo de clave con un editor de texto y pegando el contenido en el terminal Kitty.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • Alternativamente, puede cargar el archivo usando WinSCP (que usa sftp o scp como respaldo) y hacer algo similar a mi sugerencia anterior, sin la copia / pegado feo.
    cat id_rsa.pub >> .ssh/authorized_keys
    donde id_rsa.pub es el nombre de archivo de la clave pública que cargó.

Kenny Rasschaert
fuente
5

Inspirado por la respuesta de zoredache, he creado un montón de scripts que son la versión de Windows. Sin embargo, todos dependen del plink. Por favor mira aquí

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

También tengo un script winscp que se puede usar según otra respuesta. :) Extracto del archivo Léame:

Métodos intentados hasta ahora:

  • DOS (.cmd) - Éxito
  • VBS (.vbs) - Éxito
  • Powershell (.ps1) - Éxito
  • mremoteNG (aplicación ext) - Éxito
    • Seleccione Host, haga clic derecho, herramientas externas, seleccione Scriptname
  • Script WinSCP (.bat) - Éxito
    • # "WinSCP.com" /script=".\Scriptname" /parameter "user[:password]@example.com" "id_rsa.pub" [/log=".\copyssh.log]"
Vijay
fuente
1
Estos son bastante dulces
Pred
5

En Windows 7 hay un ssh.exe

Esto es lo que funcionó para mí:

1. crear identidad (en windows)

c:\>ssh-keygen

Eso creó un archivo de identidad en el directorio de inicio. Cambié el nombre de la clave pública a "id_rsa"

2. copie el archivo al sistema linux de destino usando los Créditos ssh a https://serverfault.com/users/984/zoredache para obtener su respuesta

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 alguna razón, la tubería no funcionó para mí:

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

3. Corrija el archivo en Linux El archivo id_rsa.pub en Windows es multilínea, donde Linux lo espera en una sola línea, por lo que debemos corregirlo un poco. Inicie sesión en Linux y abra el archivo:

vi ~/.ssh/authorized_keys

Por ejemplo:

---- 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 ----

debe convertirse

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

4. pruébalo

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

Esto debería enumerar el contenido de / tmp sin pedir la contraseña.

Deian
fuente
1
👍 para el Paso 3. ¡Reformatear authorized_keysa líneas simples es todo lo que necesitaba!
patricktokeeffe
feliz de que te haya ayudado - vota la respuesta :)
Deian
5

Si no tiene ssh-copy-iden Windows, puede ejecutarlo en el servidor mismo.

  • En PuTTYgen, cargue su clave privada (.ppk);
  • Copie el contenido del cuadro Clave pública para pegarlo en el archivo OpenSSH Authorizedkeys en un portapapeles.
  • Péguelo en su editor favorito (el Bloc de notas de Windows lo hará).
  • Guarde el contenido en un archivo con .pubextensión.
  • Sube el .pubarchivo al servidor.
  • Inicie sesión en el servidor con un cliente SSH, como PuTTY.
  • En el servidor escriba:

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

En Windows, el ssh-copy-idscript viene con Git para Windows . Entonces puede usar eso localmente, si tiene Git para Windows.


Si no desea hacer esto manualmente, puede usar WinSCP 5.15. Puede configurar la autenticación de clave pública por usted.
Use Herramientas> Instalar clave pública en el botón Servidor en SSH> Página de autenticación del cuadro de diálogo Configuración avanzada del sitio WinSCP .

ingrese la descripción de la imagen aquí

(Soy el autor de WinSCP)

Martin Prikryl
fuente
Esta debería ser la respuesta aceptada: git-bash para Windows 7; Subsistema de Linux disponible en Windows 10
Alex
0

Si está utilizando cmder (o msysgit / mingw que tiene scp & ssh), acabo de escribir un script simple de Python para esto. Se puede encontrar aquí: https://gist.github.com/ceilfors/fb6908dc8ac96e8fc983

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

Se le solicitará una contraseña al ejecutar el script.

techos
fuente
¿Por qué esto requiere cmder?
David Zorychta
@ user57411 No requiere cmder, requiere comandos scp y ssh.
Ceilfors
0

lo que hice, tener CygWin en mi Win10, conectarme a Linux (basado en la respuesta anterior):

- nota: usando cat, resolvería la ruta cygwin automáticamente, así como cualquier comando cygwin usando la estructura cygwin-linux-folder-structure

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)
Plátano Ácido
fuente
0

Los siguientes pasos harían:

PASO-1: Generar par de claves 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: ssh-copy-id equivalente en 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]

PASO 3: ¡La autenticación sin contraseña 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
fuente
0

Versión Powershell para SSH incluida en Git para Windows

De hecho, puede funcionar siempre que lo tenga sshen su camino. Agregue lo siguiente en su perfil de 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"      
    }
}

En una consola powershell:

ssh-copy-id user@machine
Fabuloso
fuente
Se supone que ssh-copy-id no genera una clave si no existe.
RalfFriedl
@RalfFriedl Eliminé el keygen
Fab