ssh-copy-id en Windows: el comando de PowerShell que funciona

Windows no tiene ssh-copy-id. En PowerShell, ejecuta Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo >> ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys", escribiendo tu contraseña cuando te la pidan. Esto sirve para un servidor Linux o Mac. Un servidor Windows necesita otro comando.

Actualizada el . La línea se ejecutó en PowerShell 7.4 sobre Linux contra un servidor Ubuntu 24.04, y los casos límite de archivo (finales de línea, UTF-16, falta de salto de línea) se probaron contra ese servidor.

Copiar una clave a un servidor Linux o Mac

Ejecuta esto en PowerShell en tu máquina Windows:

Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo >> ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Escribes la contraseña de la cuenta una vez. Para otro puerto, añade -p 2222 después de ssh. El mismo comando funciona en el Símbolo del sistema si sustituyes la primera parte por type %USERPROFILE%\.ssh\id_ed25519.pub.

Luego pruébalo. Esto se niega a recurrir a la contraseña, así que solo tiene éxito si la clave funciona:

ssh -o PasswordAuthentication=no user@server

¿Aún no tienes una clave? Créala antes, como se explica en cómo generar una clave SSH en Windows.

Por qué esta versión

La mayoría de las copias de este comando que hay en internet se saltan la parte de echo >>. Esta añade primero una línea vacía, porque un authorized_keys existente puede no terminar en salto de línea. Sin ella tu clave queda pegada al final de la última línea, y esa clave y la tuya dejan de funcionar. En nuestra prueba el inicio de sesión fue rechazado en ese caso y funcionó con la línea vacía, que el servidor ignora.

Otras tres cosas que comprobamos:

  • Finales de línea de Windows. Una clave seguida de CRLF siguió funcionando, con o sin comentario, en OpenSSH 9.6.
  • UTF-16. Un archivo en UTF-16 no funciona: el inicio de sesión fue rechazado. En Windows PowerShell 5.1, > y >> escriben UTF-16, así que nunca crees authorized_keys con ellos. Add-Content y la tubería de arriba no tienen este problema con una clave simple.
  • Repetir. Ejecutar el comando dos veces añade la clave dos veces. Es inofensivo, pero ssh-copy-id la habría omitido.

Si tienes Git Bash o WSL

Son entornos Unix con sus propias herramientas. Comprueba si el comando real está ahí:

command -v ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

Recuerda que WSL tiene su propia carpeta personal, así que su ~/.ssh no es tu .ssh de Windows.

Copiar una clave a un servidor Windows

La línea de arriba falla aquí, porque el shell por defecto es cmd.exe y la ubicación del archivo es distinta. La forma más simple es trabajar en el propio servidor y pegar la clave, como se muestra en la guía de OpenSSH Server.

Para hacerlo en remoto, Microsoft documenta esto para un usuario estándar:

$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"
ssh user@server $remotePowershell

Ten en cuenta que $env:USERPROFILE dentro de las comillas dobles se rellena en tu máquina, antes de enviarse. Solo cae en el lugar correcto si la ruta del perfil es la misma en ambas, así que comprueba el resultado.

Para un miembro de Administradores, la clave va en un archivo distinto con permisos estrictos:

$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '$authorizedKey';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""
ssh user@server $remotePowershell

Si el inicio de sesión sigue pidiendo contraseña

En Linux, mira el registro del servidor mientras lo intentas: los permisos de la carpeta personal, de ~/.ssh y de authorized_keys son la causa habitual. Consulta Permission denied (publickey). En un servidor Windows, comprueba primero si la cuenta es administrador y si usaste el archivo correspondiente.

Preguntas

¿Existe ssh-copy-id para Windows?

No en el cliente OpenSSH que trae Windows. Git Bash o WSL pueden tener el comando real; compruébalo con command -v ssh-copy-id. En PowerShell, pasa la clave pública a ssh con una tubería.

¿Por qué el servidor sigue pidiendo la contraseña después de copiar la clave?

Normalmente por los permisos en el servidor: la carpeta personal, ~/.ssh y authorized_keys no deben tener escritura para otros. Una clave guardada en UTF-16 o pegada a la línea anterior también falla. Mira el log del servidor mientras lo intentas.

¿Dónde va la clave pública en un servidor Windows?

Para un usuario estándar, en .ssh\authorized_keys dentro del perfil del usuario. Para un miembro de Administrators, en C:\ProgramData\ssh\administrators_authorized_keys, legible solo por Administrators y SYSTEM.

Fuentes

Más en SSH en cada sistema

Todas las guías