Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ssh-copy-id for Windows
"""ssh-copy-id for Windows.
Example usage: python ssh-copy-id.py ceilfors@my-remote-machine
This script is dependent on msysgit by default as it requires scp and ssh.
For convenience you can also try that comes http://bliker.github.io/cmder/.
"""
import argparse, os
from subprocess import call
def winToPosix(win):
"""Converts the specified windows path as a POSIX path in msysgit.
Example:
win: C:\\home\\user
posix: /c/home/user
"""
posix = win.replace('\\', '/')
return "/" + posix.replace(':', '', 1)
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--identity_file", help="identity file, default to ~\\.ssh\\idrsa.pub", default=os.environ['HOME']+"\\.ssh\\id_rsa.pub")
parser.add_argument("-d", "--dry", help="run in the dry run mode and display the running commands.", action="store_true")
parser.add_argument("remote", metavar="user@machine")
args = parser.parse_args()
local_key = winToPosix(args.identity_file)
remote_key = "~/temp_id_rsa.pub"
# Copy the public key over to the remote temporarily
scp_command = "scp {} {}:{}".format(local_key, args.remote, remote_key)
print(scp_command)
if not args.dry:
call(scp_command)
# Append the temporary copied public key to authorized_key file and then remove the temporary public key
ssh_command = ("ssh {} "
"mkdir ~/.ssh;"
"touch ~/.ssh/authorized_keys;"
"cat {} >> ~/.ssh/authorized_keys;"
"rm {};").format(args.remote, remote_key, remote_key)
print(ssh_command)
if not args.dry:
call(ssh_command)
@steph-ben

This comment has been minimized.

Copy link

steph-ben commented Mar 27, 2015

Greate snippets, thanks ! Also you can use the following command to convert "Putty-style" public key to "Open SSH" style

ssh-keygen -i -f keyfile.pub > newkeyfile.pub

See http://stackoverflow.com/questions/2224066/how-to-convert-ssh-keypairs-generated-using-puttygenwindows-into-key-pairs-use

@ghost

This comment has been minimized.

Copy link

ghost commented Jun 14, 2015

Very useful. Had to comment out the mkdir and touch at lines 39 and 40 because my server already has those but otherwise does what it says. Excellente!

@amosbird

This comment has been minimized.

Copy link

amosbird commented Aug 27, 2015

nice snippet. Line 39 should change to mkdir -p xxx

@ferielboa

This comment has been minimized.

Copy link

ferielboa commented Feb 11, 2017

i'd like to know how i could complie this code with the Cmd of windows.
Please could u write me down the command line.
Thanks

@csaladenes

This comment has been minimized.

Copy link

csaladenes commented Jul 8, 2017

Any chance to add a custom port?
UPDATE: just did, see my fork ;)

@csaladenes

This comment has been minimized.

Copy link

csaladenes commented Jul 8, 2017

@ferielboa: just copy this text and save it as ssh-copy-id.py. Then, from the folder where you saved it call python ssh-copy-id.py ceilfors@my-remote-machine. You can also add a custom port for the ssh/scp connection in my fork with the -p flag. It will ask you to login twice, once for the scp and once for the ssh connection.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.