2012-04-01 38 views
8

Tôi mới làm quen với paramiko, có ý tưởng nào về cách sử dụng hàm paramiko.RSAKey.from_private_key()?Làm thế nào để sử dụng paramiko.RSAKey.from_private_key()?

Tôi biết có một from_private_key_file(), nhưng tôi quan tâm đến việc sử dụng một hàm để phân tích một khóa riêng (như dưới đây) và sử dụng khóa riêng cho SSHClient.

Private Key (mẫu)

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

Mã Tôi muốn chạy:

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) 

Rất cám ơn.

+0

Got bản sửa lỗi cho cuối cùng này? – zengr

Trả lời

4

from_private_key() dường như mất một đối tượng file:

from_private_key (cls, file_obj, password = Không)

Tạo một đối tượng quan trọng bằng cách đọc một khóa bí mật từ một tập tin (hoặc tập tin giống như) đối tượng . Nếu khóa riêng được mã hóa và mật khẩu không phải là Không, mật khẩu đã cho sẽ được sử dụng để giải mã khóa (nếu không thì PasswordRequiredException sẽ bị ném).

Tham số:

file_obj (file) - tập tin để đọc từ mật khẩu (str) - một mật khẩu tùy chọn để sử dụng để giải mã khóa, nếu nó được mã hóa

Returns: PKEY

đối tượng khóa mới dựa trên khóa riêng đã cho

Tăng:

IOError - nếu có lỗi đọc phím

PasswordRequiredException - nếu file private key được mã hóa và mật khẩu là Không

SSHException - nếu các tập tin quan trọng là không hợp lệ

Vì vậy, để nuôi nó một chìa khóa như là một chuỗi bạn có thể sử dụng StringIO, giống như:

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

Tôi chưa thử nghiệm điều này. phương pháp

+1

Không hoạt động. 'key_string' là khóa riêng dưới dạng chuỗi. Tôi nhận được ngoại lệ này: 'SSHException: không phải là tệp khóa riêng tư hợp lệ RSA ' – zengr

4

Lev làm việc cho tôi:

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

Thậm chí dễ dàng hơn với' paramiko.RSAKey.from_private_key_file (tên tệp) ', xem http://docs.paramiko.org/en/1.15/api/keys. html # paramiko.pkey.PKey.from_private_key_file – ezdazuzena

+0

@ezdazuzena, đôi khi bạn chỉ có chuỗi trong bộ nhớ chứ không phải tệp. – odiszapc

+0

cho python3, sử dụng io thay vì StringIO –

1

Đây là nơi 'gõ vịt' có ích - nó không phải là một con vịt (= file), nó chỉ có cư xử như một.

Một thử nghiệm nhỏ cho thấy rằng, bất kỳ đối tượng nào có phương thức readlines() hợp lệ đều tốt.

Tôi giả nó với:

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

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

Đây là cực kỳ hacky, nhưng nó hoạt động.

Điều này có nghĩa là, khi bạn gọi myfakefile (chuỗi khóa), nó tạo myfakefile.readlines, trả về nội dung (chia nhỏ) của keystrings.

Sau đó, hàm sẽ trả về hàm.

Chức năng tương tự được chuyển đến from_private_key. from_private_key, nghĩ rằng đó là một tập tin, gọi myfakefile.readlines(). Điều này gọi hàm mới được tạo (lambda), trả về loại điều bạn mong chờ từ tệp.readlines() - hoặc, đủ gần, dù sao đi nữa.

Lưu ý rằng, tiết kiệm các kết quả sẽ không làm việc như mong đợi:

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

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

Có nhiều phương pháp mạnh mẽ hơn của việc này để làm việc như nó nên, nhưng không có giá trị nỗ lực - chỉ cần sử dụng StringIO nếu nhu cầu của bạn phức tạp hơn.

+0

trong khi tôi thích kiểu này, tôi không chắc chắn tôi muốn giới thiệu điều này (paramiko _may_ thay đổi API của nó). –

-1

Câu hỏi rất cũ, nhưng trong trường hợp nó giúp một số linh hồn bất hạnh: sol'n của tôi cho vấn đề này là phải tạo một khóa mới với các tùy chọn mặc định, sử dụng

ssh-keygen -t rsa

chủ chốt trước đây của tôi được tạo ra sử dụng

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

mà paramiko đã phàn nàn như đã làm cho OP.

+0

Paramiko phàn nàn là vì cờ -o đã lưu khóa theo định dạng OpenSSH và * không * paramiko định dạng RSA mong đợi. Nếu bạn thả cờ -o khi tạo khóa paramiko thì hãy làm việc với khóa kết quả. – KiwiMartin

0

này nên làm điều đó:

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) 
Các vấn đề liên quan