2012-04-01 12 views
8

私はparamikoに新しいです、どのように私はparamiko.RSAKey.from_private_key()関数を使用することができますか?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) 

感謝します。

+0

は最終的に、このための修正を手に入れましたか? – zengr

答えて

4

from_private_key()は明らかにファイルオブジェクトを取ります。

from_private_key(CLS、file_obj、パスワード=なし)

は、ファイル(またはファイルのような)から秘密鍵を読み出すことにより、キーオブジェクトを作成したオブジェクト。秘密鍵が暗号化されていて、パスワードがNoneでない場合、指定されたパスワードが鍵の復号化に使用されます(そうでない場合はPasswordRequiredExceptionがスローされます)。

パラメータ:

file_obj(ファイル) - パスワード(文字列)から読み込むためのファイル - オプションのパスワードそれは

戻り、暗号化されます場合は、キーを解読するために使用する:PKEY

を与えられた秘密鍵

に基づいて、新しいキーオブジェクトを発生させます:

例外IOError - エラーが発生した場合キー

PasswordRequiredExceptionを読んで - 秘密鍵ファイルを暗号化し、パスワードはなし

SSHExceptionですされていない場合 - キーファイルは、だから、それをすることができます文字列としてキーを養うために

無効である場合

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

私はこれをテストしていませんが、StringIOのようなものを使用してください。

+1

動作しません。 'key_string'は文字列としての秘密鍵です。私はこの例外を受け取ります: 'SSHException:有効なRSA秘密鍵ファイルではありません。 ' – zengr

4

レフの方法は、私の仕事:「ダックタイピング」は便利になるのはここ

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

' paramiko.RSAKey.from_private_key_file(filename) 'でさらに簡単にはhttp://docs.paramiko.org/en/1.15/api/keysを参照してください。 html#paramiko.pkey.PKey.from_private_key_file – ezdazuzena

+0

@ezdazuzena、時々あなたはファイルではなくメモリ内に文字列しかありません。 – odiszapc

+0

python3の場合はStringIO –

1

がある - それはアヒル(=ファイル)である必要はありません、それはちょうど1のように振る舞う必要があります。

少しの実験では、有効なreadlines()メソッドを持つオブジェクトはすべて正常であることがわかりました。

私はそれを偽造:これは信じられないほどハックですが、それが動作

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

mykey = paramiko.RSAKey.from_private_key(myfakefile(keystring)) 

これは、myfakefile(キーストリング)を呼び出すと、キーストリングの(分割された)内容を返すmyfakefile.readlinesを作成します。

次に、関数を返します。

同じ関数がfrom_private_keyに渡されます。 from_private_keyはファイルであると考え、myfakefile.readlines()を呼び出します。これは、新しく作成された(ラムダ)関数を呼び出します。これは、file.readlines()から期待されるものを返します。結果を保存すると、期待通りに動作しません、

注:

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

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

ありそれが必要として動作するように、これを取得するより堅牢な方法がありますが、努力する価値はない - あなたのニーズがある場合だけにStringIOを使用より複雑。

+0

の代わりにioを使用しますが、私はこのスタイルが好きですが、私はこれをお勧めしたいとは思いません(paramiko _may_はAPIを変更してください)。 –

-1

非常に古い質問が、場合には、それはいくつかの不幸な魂を支援します。この問題への私のsol'nは、デフォルトのオプションを使用して新しいキーを生成することでした、私の以前の鍵が使用して生成された

ssh-keygen -t rsa

を使用してそれはOPのために行ったようparamikoが不満

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

+0

Paramikoは、-oフラグがキーをOpenSSH形式で保存していたため、paramikoが期待していたRSA形式ではないと訴えています。キーを生成するときに-oフラグを削除すると、結果として得られるキーでparamikoが動作するはずです。 – KiwiMartin

0

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

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) 
関連する問題