Sign up ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Is there any equivalent or port of ssh-copy-id available for Windows? That is, is there an easy way to transfer SSH keys from a local machine to a remote server under Windows?

In case it helps, I'm using Pageant and Kitty (a Putty alternative) already.

share|improve this question

7 Answers 7

up vote 15 down vote accepted

ssh-copy-id is a pretty simple script that should be pretty easy to replicate under windows.

If you ignore all the parameter handling, error handling, and so on, these are the two commands from ssh-copy-id that are actually doing the work most of the time.

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

Using the putty tools a command like this should be equivalent (not tested).

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

If you want to do all the same error handling, and the automatic key location, I am sure writing a script under Windows will be a lot trickier, but certainly possible.

share|improve this answer
Thanks! I couldn't get it to work at first; I was getting "access denied" errors back, but plink wasn't stopping to let me enter the password. I then tried passing plink the password using the -pw switch and that worked. Do you know if there is a way to get plink to pause for you to enter the password mid-way through? –  Matt V. Jan 20 '11 at 22:45
Not really sure about password authentication and plink. Whenever I actually use it I already have my key on the system, and I have pagent running. –  Zoredache Jan 20 '11 at 23:17
plink.exe -pw password works. Also if you know .ssh/authorized_keys exists the command is simply type | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys" –  KCD Apr 15 '14 at 0:50

ssh-copy-id does a couple of things (read the man page for details), but the most important thing it does is append the contents of your local public key file to a remote file called authorized_keys.

  • You could do this yourself by opening the key file with a text editor and pasting the contents in the Kitty terminal.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • Alternatively, you could upload the file using WinSCP (which uses sftp, or scp as a fallback) and do something similar to my previous suggestion, without the ugly copy/pasting.
    cat >> .ssh/authorized_keys
    where is the filename of the public key you uploaded.

share|improve this answer

These answers didn't help me out. I really didn't need any crazy scripts. I had created a public key on my client machine in git bash and was trying to copy it to a VPS.

After creating your public key, the key should be stored as "(whatever folder you started in)/.ssh/"

So use this command:
cat ~/.ssh/ | ssh user@ "cat >> ~/.ssh/authorized_keys" where user is your username (sometimes "root", or whatever you may have set up), and replace with your machine / host / VPS's IP address.

If the directory .ssh is not yet created on the host machine, use this small variation:
cat ~/.ssh/ | ssh user@ "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

share|improve this answer

Inspired by zoredache's answer, I've created a bunch of scripts that are the windows version. However they all depend on plink. Please take a look here

I also have a winscp script that can be used as per another answer. :) Excerpt from the readme:

Attempted methods so far:

  • DOS(.cmd) - Success
    • usage: .\Scriptname password [identity file]
  • VBS (.vbs) - Success
    • usage: .\Scriptname / /p:password
  • Powershell(.ps1) - Success
    • usage: .\Scriptname -i password
  • mremoteNG (ext app) - Success
    • Select Host, right click, external tools, select Scriptname
  • WinSCP script (.bat) - Success
    • # "" /script=".\Scriptname" /parameter "user[:password]" "" [/log=".\copyssh.log]"
share|improve this answer
These are pretty sweet –  Pred Jul 29 at 16:18

If you are using cmder (or msysgit/mingw that has scp & ssh), I just wrote a simple python script for this. It can be found here:

Sample usage: python user@remote-machine.

Password will be prompted upon running the script.

share|improve this answer

In Windows 7 there is a ssh.exe

Here is what worked for me:

1. create identity (on windows)


That created an identity file in the home directory. I changed the name of the public key to "id_rsa"

2. copy the file to the target linux system using the ssh Credits to for his answer

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\

Note: For some reason piping didn't work for me:

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

3. Correct the file on linux The file on windows is multiline where linux expects it in in a single line so we have to correct it a bit. Login to linux and open the file:

vi ~/.ssh/authorized_keys

For example:

Comment: "2048-bit RSA, user@winhost"

should become

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

4. test it

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

This should list the content of /tmp without asking for the password.

share|improve this answer

what i did, having CygWin on my Win10, connecting to Linux (based on aboves answer):

- note: using cat, it would resolve the cygwin path automatically, as well as any cygwin command using the 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/ | 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)
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.