如何使用paramiko.RSAKey.from_private_key()?

Mic*_*ong 10 python paramiko

我是paramiko的新手,知道如何使用paramiko.RSAKey.from_private_key()函数吗?

我知道有一个from_private_key_file(),但我有兴趣使用一个函数来解析私钥(如下所示)并使用该私钥进行SSHClient.

私钥(样本)

-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKCAIEAmfgmlY95SHXhCeBNdkhSrsG4JVbqyew845yoZRX3wcS2/doz\niVQxgx0aiOwLi+/Rnkb3PLUIwoxb/LoD/W0YMS6/NSUMt+LdH+zsjeNF2iq4rDzU\nwDSqi27q/8u/egrK7H+9HNKEVXb/87utAAm3VTM9KqKaK3VuVFrNrnsDSuECAwEA\nAQKCAIBZn3y2KiGq8BLiMNJmO4sFdnW+Jm3cw8pdo17SGItzGxJ5iX3ePkfjzhkY\nAm5mMl6OBzj6+VX0CMeywIR6C/q8HwDYSmZcuU5v76/DoW5bI6xkPrroqEz6aRE5\nyN+2hf65RD3eoPATsdrP/kxiKjZg9uG9LhgIXyVwYFs1RcqewQJBAMCVJlEYXRio\neynUtyES9HNmUGUqHKmri1FZfO56/mFdG5ZXsKE48qURCAGVxI+goGQ4vtJIXB2J\nyTEr+5qYtE0CQQDMq9/iigk+XDOa9xGCbwxbLGdPawaEivezMVdPqVzH971L6kZ8\nhEnev1DqujgGCyR+QYPW1ZCXH05FY9CqWwrlAkATzYJyJlI0XebER2ZJVVyjnSq5\nLFpkLAqYY95P23/a3SsgC4ZTHbr9tEGhgBgFONwlUhx1HRGzy95PWxl1LSylAkBk\nwP93v8gJIM5urM27zfrhLxy0ZdVRji+d0N5QYuk/r19KbcvBJEZRFxE4W++UWgve\n81V5fqytGEYptpdUJXlZAkEArxZDiT1HXXGciIgzZbh53McogPCGHiKOOPSjpM41\npneDFVvwgezCWoDauxNDzu7Nl55qPJsmvfKZ+SKvCajrhQw==\n-----END RSA PRIVATE KEY-----\n
Run Code Online (Sandbox Code Playgroud)

我想运行的代码:

import paramiko
ssh = paramiko.SSHClient()
# how do I pass in the private_key, when my private_key (shown above) is in string?
mykey = paramiko.RSAKey.from_private_key(private_key) 
ssh.connect('192.168.1.2', username = 'vinod', pkey = mykey)
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Pau*_*ski 9

列夫的方法对我有用:

>>> import paramiko
>>> f = open('/path/to/key.pem','r')
>>> s = f.read()
>>> import StringIO
>>> keyfile = StringIO.StringIO(s)
>>> mykey = paramiko.RSAKey.from_private_key(keyfile)
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect('myserver.compute-1.amazonaws.com', username='ubuntu', pkey=mykey)
>>> stdin, stdout, stderr = ssh.exec_command('uptime')
>>> stdout.readlines()
[' 19:21:10 up 24 days, 42 min,  1 user,  load average: 0.14, 0.06, 0.05\n']
Run Code Online (Sandbox Code Playgroud)

  • 使用“paramiko.RSAKey.from_private_key_file(filename)”更容易,请参阅http://docs.paramiko.org/en/1.15/api/keys.html#paramiko.pkey.PKey.from_private_key_file (4认同)
  • 对于python3,请使用io而不是StringIO (2认同)

Lev*_*sky 6

from_private_key() 显然需要一个文件对象:

from_private_key(cls,file_obj,password = None)

通过从文件(或类文件)对象中读取私钥来创建密钥对象.如果私钥被加密且密码不是None,则使用给定的密码来解密密钥(否则抛出PasswordRequiredException).

参数:

file_obj(file) - 从密码读取的文件(str) - 用于解密密钥的可选密码(如果已加密)

返回:PKey

基于给定私钥的新密钥对象

举:

IOError - 如果读取密钥时出错

PasswordRequiredException - 如果私钥文件已加密,密码为None

SSHException - 如果密钥文件无效

所以要把它作为一个字符串给你提供StringIO,你可以使用,如:

private_key = StringIO.StringIO(key_string)
mykey = paramiko.RSAKey.from_private_key(private_key)
Run Code Online (Sandbox Code Playgroud)

不过,我没有测试过这个.

  • 不起作用 `key_string`是作为字符串的私钥。我收到以下异常信息:SSHException:不是有效的RSA私钥文件。 (2认同)

Qui*_*ber 6

这应该这样做:

import io
import paramiko

private_key_file = io.StringIO()
private_key_file.write('-----BEGIN RSA PRIVATE KEY-----\nlskjdflk\n...\n-----END RSA PRIVATE KEY-----\n')
private_key_file.seek(0)
private_key = paramiko.RSAKey.from_private_key(private_key_file)
Run Code Online (Sandbox Code Playgroud)