web-dev-qa-db-ja.com

paramiko.RSAKey.from_private_key()はどのように使用しますか?

私はparamikoを初めて使用しますが、paramiko.RSAKey.from_private_key()関数をどのように使用できるか考えていますか?

From_private_key_file()があることは知っていますが、関数を使用して秘密鍵(以下のように)を解析し、S​​SHClientにその秘密鍵を使用することに興味があります。

秘密鍵(サンプル)

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

実行したいコード:

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)

どうもありがとう。

11
Mickey Cheong

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']
10
Paul Zielinski

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)

しかし、私はこれをテストしていません。

6
Lev Levitsky

これはそれを行う必要があります:

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)
2
Quinn Weber

ここで「ダックタイピング」が役に立ちます。アヒル(=ファイル)である必要はなく、1つのように動作する必要があります。

少し実験すると、有効な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に渡されます。 from_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を使用してください。

1
AMADANON Inc.

非常に古い質問ですが、不幸なことに役立つ場合に備えて、この問題の解決策は、デフォルトのオプションを使用して新しいキーを生成することでした。

ssh-keygen -t rsa

以前のキーはを使用して生成されました

ssh-keygen -t rsa -b 4096 -a 100

oPの場合と同じように、どのparamikoが不平を言ったか。

0
user1093043