9

I'm trying to create a single file executable in Python and using Paramiko for my SSH. I need to eliminate external files such as private key files and try to go for embedded strings.

I tried this solution but it's not working for me:
Paramiko: Creating a PKey from a public key string

How do I accomplish this? Thanks.

Martin Prikryl
  • 167,268
  • 50
  • 405
  • 846
scottyp
  • 275
  • 1
  • 4
  • 12

2 Answers2

20

The solution you mentioned:

key = paramiko.RSAKey(data=base64.b64decode('AAblablabla...'))

works fine however it may be inconvenient to store the key in base64 format.

The following code shows how to use the key stored in "plain-text" format (as key-files in ~/.ssh directory):

import paramiko
import StringIO

my_key = """\
-----BEGIN RSA PRIVATE KEY-----
<your key here>
-----END RSA PRIVATE KEY-----"""

pkey = paramiko.RSAKey.from_private_key(StringIO.StringIO(my_key))

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='host', username='user', pkey=pkey)

...

ssh.close()

In Python 3:

import io
# ...
pkey = paramiko.RSAKey.from_private_key(io.StringIO(my_key))

See StringIO in Python3

Martin Prikryl
  • 167,268
  • 50
  • 405
  • 846
teegaar
  • 796
  • 6
  • 17
  • Works perfectly! Thanks teegaar :) BTW, do you think this kind of private key embed is safe? Or do you have other suggestions (like using public key instead) that works with paramiko? cheers. – scottyp Dec 28 '14 at 13:44
  • scottyp, I think it is not safe as you store your key in the executable. You may take measures to make it harder to reveal the key but anyway it won't be totally safe. – teegaar Dec 28 '14 at 14:31
-1

To add a public key from a string on the ssh client you must set the keyword arg look_for_keys=False then use the MissingHostKeyPolicy classes missing_host_key() method to add the key from your string.

my_pub_key = "xx.xx.xx.xx ecdsa-sha2-nistp256 mlzdHAyNT....."
my_host = my_pub_key.split(' ')[0]
password = 'myFavortitePassword'
username = 'myUsername'

ssh_client=paramiko.SSHClient()

host_key_policy = paramiko.MissingHostKeyPolicy()
host_key_policy.missing_host_key(ssh_client, my_host, my_pub_key)

ssh_client.connect(hostname= my_host
                            ,username=username
                            ,password=password
                            ,port=22
                            ,look_for_keys=False)