2012-05-20 59 views
26

Tôi đang cố gắng để bắt đầu với thư viện paramiko, nhưng thư viện được ném một ngoại lệ ngay sau khi tôi cố gắng kết nối với các chương trình đơn giản sau đây:paramiko "Unknown Server"

import paramiko 
ssh = paramiko.SSHClient() 
ssh.connect('127.0.0.1', username='boatzart', password='mypassword') 

Các lỗi tôi get is:

Traceback (most recent call last): 
File "test.py", line 6, in <module> 
ssh.connect('127.0.0.1') 
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 316, in connect 
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 85, in missing_host_key 
paramiko.SSHException: Unknown server 127.0.0.1 

Điều này xảy ra bất kể tôi thử máy chủ nào.

Trả lời

22

Trường hợp ngoại lệ được nuôi nấng bởi vì bạn đang thiếu một chính chủ, chứ không phải khó hiểu "Unknown máy chủ" là đầu mối - kể từ khi ngoại lệ được huy động từ missing_host_key

Hãy thử điều này thay vì:

import paramiko 

paramiko.util.log_to_file('ssh.log') # sets up logging 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.connect('127.0.0.1', username=username, password=password) 
stdin, stdout, stderr = client.exec_command('ls -l') 
71

tôi đã gặp phải sự cố tương tự và đây là giải pháp có hiệu quả đối với tôi:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect('127.0.0.1', username=username, password=password) 
stdin, stdout, stderr = client.exec_command('ls -l') 

Đây là chính sách để sử dụng khi kết nối với máy chủ không có khóa máy chủ trong các đối tượng HostKeys của hệ thống hoặc cục bộ. Chính sách mặc định là từ chối tất cả các máy chủ không xác định (sử dụng RejectPolicy). Bạn có thể thay thế AutoAddPolicy hoặc viết lớp chính sách của riêng bạn.

Thêm chi tiết tại paramiko api doc. Hi vọng điêu nay co ich.

+1

Nó hoạt động và tôi cũng làm như vậy, nhưng đáng nói đến bạn là tự động tin tưởng vào máy mục tiêu và tiếp xúc kỹ với con người trong các cuộc tấn công ở giữa. Chỉ cần đề cập đến caveat! – F1Rumors

+0

Nó hoạt động. Tôi đã thử nghiệm trên windows10 – wazhao

+0

Liệu 'AutoAddPolicy()' có thêm host_key vào known_hosts hay không. Vì vậy, lần sau khi chạy, tôi có thể xóa 'set_missing_host_key_policy()' và chỉ sử dụng 'load_system_host_keys()'? – nidHi

5

Tôi gặp lỗi này: Tôi có thể kết nối từ trình bao, nhưng paramiko nói "Máy chủ không xác định workdevel114".

Có hai mục tương tự trong known_hosts:

[email protected]> grep workdevel114 ~/.ssh/known_hosts 
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF.... 
[email protected]> grep I1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF ~/.ssh/known_hosts 
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sK... 
|1|f/auQ9nY5dFbVtOdY3ocjtVO9dM=|esvazUDTT3VIcLk9DxmPI6FZt1s= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4... 

Mục giây (| 1 | ....) dường như để gây nhầm lẫn paramiko. Tôi đoán nó là có liên quan đến vé này: https://github.com/paramiko/paramiko/issues/67

tôi giải quyết nó bằng cách thêm dòng này:

client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

Nhưng điều này sẽ vô hiệu hóa máy chủ kiểm tra của giao thức ssh trong trường hợp này: paramiko nghĩ host key không rõ , nhưng nó được biết đến. Khóa đã biết bị bỏ qua. Tôi không quan tâm bởi vì những cuộc tấn công giữa những kẻ trung gian rất khó xảy ra trong môi trường của tôi.

paraiko phiên bản: 1.7.7.1-1ubuntu1

+0

Tôi biết đây là một chủ đề cũ nhưng việc thêm "set_missing_host_key_policy" đã giải quyết được vấn đề của tôi, vì sử dụng "load_system_host_keys" chưa đủ – ton

6

tôi gặp phải vấn đề này và muốn gửi một workaround đây. Vấn đề thực sự là máy chủ ssh gửi các khóa ecdsa, không được hỗ trợ (chưa) với paramiko. Trên hệ thống Wheezy debian tôi tàn tật ECDSA bằng cách bình luận ra một dòng trong/etc/ssh/sshd_config:

# HostKey/etc/ssh/ssh_host_ecdsa_key

Khởi động lại sshd, và nó đã trở lại sử dụng RSA. Có một số khóa ecdsa trong tệp known_hosts của tôi vì vậy tôi vừa xóa nó để đặt lại và đăng nhập theo cách thủ công để tạo lại các khóa. Từ đó, paramiko hoạt động hoàn hảo như mong đợi, với việc kiểm tra khóa máy chủ RSA.

+0

cảm ơn vì đã cho phép chúng tôi biết, đã xảy ra với tôi quá & các giải pháp tương tự được áp dụng! – zenperttu

2

Cách đúng là một trong hai:

  • Gọi HostKeys.add trên dụ trả về bởi SSHClient.get_host_keys trước khi gọi các connect, đi qua nó chìa khóa đáng tin cậy.

    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" 
    key = paramiko.RSAKey(data=decodebytes(keydata)) 
    client.get_host_keys().add('example.com', 'ssh-rsa', key) 
    
  • Hoặc tải hostkey đã được lưu trữ (ví dụ bằng dòng lệnh ssh) sử dụng client.load_system_host_keys().

  • Hoặc bạn ít nhất có thể lưu bộ nhớ cache của máy chủ từ lần thử đầu tiên để đảm bảo rằng nó không thay đổi trong tương lai.

    Để sử dụng đó SSHClient.load_host_keys trước connect. Nó làm cho Paramiko tự động thêm khóa máy chủ mới vào tệp (khi được kết hợp với AutoAddPolicy).