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
これは、どのサーバーを試しても発生します。
例外はホストキーがないために発生しました。例外は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')
同じ問題が発生しましたが、解決策は次のとおりです。
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 をご覧ください。お役に立てれば。
私はこの問題に遭遇し、回避策をここに投稿したいと思いました。問題は確かに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ホストキーチェックを使用して、期待どおりに完全に機能しました。
このエラーが発生しました:シェルから接続できますが、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
正しい方法は次のいずれかです。
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
と組み合わせた場合)。