web-dev-qa-db-ja.com

パラミコ「未知のサーバー」

Paramikoライブラリを使い始めようとしていますが、次の簡単なプログラムで接続しようとすると、ライブラリが例外をスローします。

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

私が得るエラーは:

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

これは、どのサーバーを試しても発生します。

27
rcv

例外はホストキーがないために発生しました。例外はmissing_Host_key

代わりにこれを試してください:

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')
25
Burhan Khalid

同じ問題が発生しましたが、解決策は次のとおりです。

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

これは、システムまたはローカルのHostKeysオブジェクトにホストキーがないサーバーに接続するときに使用するポリシーを設定するためのものです。デフォルトのポリシーでは、(RejectPolicyを使用して)すべての不明なサーバーを拒否します。 AutoAddPolicyを代用するか、独自のポリシークラスを作成できます。

詳細は paramiko api doc をご覧ください。お役に立てれば。

71
user1224821

私はこの問題に遭遇し、回避策をここに投稿したいと思いました。問題は確かにsshサーバーがecdsa鍵を送信することでしたが、paramikoでは(まだ)サポートされていません。私のdebian Wheezyシステムでは、/ etc/ssh/sshd_configの1行をコメント化してecdsaを無効にしました。

#HostKey/etc/ssh/ssh_Host_ecdsa_key

Sshdを再起動し、RSAの使用に戻りました。私のknown_hostsファイルにいくつかのECDSAキーがあったので、それを削除してリセットし、手動でログインしてキーを再作成しました。そこから、paramikoは、RSAホストキーチェックを使用して、期待どおりに完全に機能しました。

7
zeugmatis

このエラーが発生しました:シェルから接続できますが、paramikoは "Unknown server workdevel114"と言っています。

Known_hostsには2つの同様のエントリがありました。

user@Host> grep workdevel114 ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF....
user@Host> grep I1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sK...
|1|f/auQ9nY5dFbVtOdY3ocjtVO9dM=|esvazUDTT3VIcLk9DxmPI6FZt1s= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4...

秒のエントリ(| 1 | ....)は、paramikoを混乱させるようです。このチケットに関連していると思います: https://github.com/paramiko/paramiko/issues/67

私はこの行を追加してそれを解決しました:

client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())

ただし、この場合、sshプロトコルのホストチェックが無効になります。Paramikoは、ホストキーは不明であると認識していますが、既知です。既知のキーは無視されます。私の環境では中間者攻撃はほとんどあり得ないので、私は気にしません。

paraiko-version:1.7.7.1-1ubuntu1

6
guettli

正しい方法は次のいずれかです。

  • connectを呼び出す前に _HostKeys.add_ によって返されたインスタンスで _SSHClient.get_Host_keys_ を呼び出し、信頼できるキーを渡します。

    _from base64 import decodebytes
    # ...
    
    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
    key = paramiko.RSAKey(data=decodebytes(keydata))
    client.get_Host_keys().add('example.com', 'ssh-rsa', key) 
    _

    コードで使用するフィンガープリントを取得する方法を確認するには、私の答えを参照してください。
    pysftpでホストキーを確認

    指紋のみを知っている場合は、以下を参照してください。
    Python-pysftp/paramiko-フィンガープリントを使用してホストキーを確認する

  • または client.load_system_Host_keys() を使用して、すでにキャッシュされているホストキーをロードします(例:コマンドラインssh)。

  • または、少なくとも最初にホストキーをキャッシュして、将来変更されないようにすることもできます。

    そのためには、connectの前に _SSHClient.load_Host_keys_ を使用します。これにより、Paramikoは自動的に新しいホストキーをファイルに追加します( AutoAddPolicy と組み合わせた場合)。

2
Martin Prikryl