Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用paramiko.RSAKey.from_private_key()?_Python_Ssh_Paramiko_Ssh Keys - Fatal编程技术网

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

Python 如何使用paramiko.RSAKey.from_private_key()?,python,ssh,paramiko,ssh-keys,Python,Ssh,Paramiko,Ssh Keys,知道如何使用paramiko.RSAKey.from_private_key()函数吗 我知道有一个来自_private_key_file()的,但我感兴趣的是使用函数解析私钥(如下所示),并将该私钥用于SSHClient 私钥(示例): 我想运行的代码: import paramiko ssh = paramiko.SSHClient() # how do I pass in the private_key, when my private_key (shown above) is in st

知道如何使用
paramiko.RSAKey.from_private_key()
函数吗

我知道有一个来自_private_key_file()的
,但我感兴趣的是使用函数解析私钥(如下所示),并将该私钥用于
SSHClient

私钥(示例):

我想运行的代码:

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)
非常感谢。

from\u private\u key()
显然接受了一个文件对象:

来自私钥(cls,文件对象,密码=无)

通过从文件(或类似文件)对象读取私钥来创建密钥对象。如果私钥已加密且密码不是None,则将使用给定的密码解密密钥(否则将引发PasswordRequiredException)

参数:

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

返回:PKey

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

提出:

IOError-如果读取密钥时出错

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

SSHException-如果密钥文件无效

因此,要将一个键作为可以使用的字符串提供给它,类似于:

private_key = StringIO.StringIO(key_string)
mykey = paramiko.RSAKey.from_private_key(private_key)

不过,我还没有对此进行测试。

Lev的方法对我很有效:

>>> 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']

这里是“duck-typing”派上用场的地方——它不必是duck(=文件),它只需表现得像一个duck

一些实验表明,任何具有有效readlines()方法的对象都可以

我伪造了它:

def myfakefile(keystring):
    myfakefile.readlines=lambda: keystring.split("\n")
    return myfakefile

mykey = paramiko.RSAKey.from_private_key(myfakefile(keystring))
这是令人难以置信的骇客,但它的工作

它的作用是,当您调用myfakefile(keystring)时,它会创建myfakefile.readlines,它返回键串的(拆分)内容

然后,它返回函数

将相同的函数传递给from_private_key。从_private_key,认为它是一个文件,调用myfakefile.readlines()。这将调用新创建的(lambda)函数,该函数返回您希望从file.readlines()中得到的内容,或者,无论如何,如果足够接近,则返回

请注意,保存结果不会按预期工作:

k1=myfakefile(keystring1)
k2=myfakefile(keystring2)

 # This will return keystring2, not keystring1!
paramkiko.RSAKey.from_private_keyfile(k1.readlines())

有更可靠的方法让它正常工作,但不值得付出努力-如果您的需要更复杂,就使用StringIO。

非常老的问题,但万一它帮助了一些不幸的灵魂:我解决这个问题的方法是使用

ssh-keygen-t rsa

我以前的密钥是使用

ssh-keygen-t rsa-b4096-a100

帕拉米科抱怨的是什么,就像它在OP中抱怨的那样。

这应该可以做到:

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)

不起作用
key\u string
是作为字符串的私钥。我得到这个异常:
SSHException:不是有效的RSA私钥文件
使用
paramiko.RSAKey更容易。从私钥文件(文件名)
中,请参阅@ezdazuzena,有时内存中只有字符串,而不是文件。对于python3,使用io而不是StringIO。你救了我的命。我花了一整天的时间找出了问题所在。而且我忘了在使用别人的密钥时需要设置用户名。(!)()这需要在搜索引擎结果的顶部。在我找到这个之前,我尝试了其他几个在搜索结果中排名靠前的来源。但这是我尝试过的许多方法中第一个奏效的方法。在这里,将文件读入变量似乎是关键的一步。如果在生成密钥时删除-o标志,则paramiko应该与结果密钥一起工作。虽然我喜欢这种样式,但我不确定是否推荐这种样式(paramiko可能会更改其API)。
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)