私は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
実行したいコード:
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)
どうもありがとう。
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']
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)
しかし、私はこれをテストしていません。
これはそれを行う必要があります:
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)
ここで「ダックタイピング」が役に立ちます。アヒル(=ファイル)である必要はなく、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を使用してください。
非常に古い質問ですが、不幸なことに役立つ場合に備えて、この問題の解決策は、デフォルトのオプションを使用して新しいキーを生成することでした。
ssh-keygen -t rsa
以前のキーはを使用して生成されました
ssh-keygen -t rsa -b 4096 -a 100
oPの場合と同じように、どのparamikoが不平を言ったか。