Как использовать paramiko.RSAKey.from_private_key ()? - PullRequest
9 голосов
/ 01 апреля 2012

Я новичок в 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)

Большое спасибо.

Ответы [ 5 ]

9 голосов
/ 05 декабря 2013

Метод Льва сработал у меня:

>>> 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']
5 голосов
/ 01 апреля 2012

from_private_key() по-видимому, принимает файловый объект:

from_private_key (cls, file_obj, password = None)

Создание ключевого объекта путем чтения личного ключа из файлового (или подобного файлу) объекта. Если закрытый ключ зашифрован и пароль не имеет значения None, данный пароль будет использоваться для расшифровки ключа (в противном случае генерируется исключение PasswordRequiredException).

Параметры:

file_obj (file) - файл для чтения пароль (str) - необязательный пароль, используемый для расшифровки ключа, если он зашифрован

Возвращает: PKey

новый ключевой объект на основе заданного закрытого ключа

Поднимает:

IOError - если при чтении ключа произошла ошибка

PasswordRequiredException - если файл закрытого ключа зашифрован и пароль отсутствует

SSHException - если файл ключа недействителен

Таким образом, для подачи ключа в виде строки вы можете использовать StringIO, что-то вроде:

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

Хотя я не проверял это.

2 голосов
/ 26 января 2017

Это должно сделать это:

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 голос
/ 14 июля 2016

Здесь пригодится «типирование утки» - оно не обязательно должно быть УТКОЙ (= файл), оно просто ДОЛЖНО БЫТЬ, как один.

Небольшой эксперимент показывает, что с любым объектом, который имеет допустимый метод 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 (). Это вызывает вновь созданную (лямбда) функцию, которая возвращает то, что вы ожидаете от file.readlines () - или, в любом случае, достаточно близко.

Обратите внимание, что сохранение результатов не будет работать должным образом:

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

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

Существуют более надежные способы заставить это работать должным образом, но не стоит усилий - просто используйте StringIO, если ваши потребности более сложные.

0 голосов
/ 26 августа 2016

Очень старый вопрос, но в случае, если это поможет какой-то несчастной душе: моя задача была в том, чтобы сгенерировать новый ключ с опциями по умолчанию, используя

ssh-keygen -t rsa

Myпредыдущий ключ был сгенерирован с использованием

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

, на что Paramiko пожаловалась, как это было для OP.

...